Android数据存取之Files

如同前面说的使用Preferences一样,使用File来读写文件也属于常规思路。在Android中没有提供像J2SE里面多的让人抓狂的有关于IO的API。所以使用起来非常简单轻巧。

在Android系统中,这些文件保存在 /data/data/PACKAGE_NAME/files 目录下。

数据读取

  1. public static Stringread(Contextcontext,Stringfile){
  2. Stringdata= "" ;
  3. try {
  4. FileInputStreamstream=context.openFileInput(file);
  5. StringBuffersb= new StringBuffer();
  6. int c;
  7. while ((c=stream.read())!=- 1 ){
  8. sb.append(( char )c);
  9. }
  10. stream.close();
  11. data=sb.toString();
  12. } catch (FileNotFoundExceptione){
  13. } catch (IOExceptione){
  14. }
  15. return data;
  16. }

从代码上,看起来唯一的不同就是文件的打开方式了: context.openFileInput(file); Android中的文件读写具有权限控制,所以使用context(Activity的父类)来打开文件,文件在相同的Package中共享。这里的 Package的概念同Preferences中所述的Package,不同于Java中的Package。

数据写入

  1. public static void write(Contextcontext,Stringfile,Stringmsg){
  2. try {
  3. FileOutputStreamstream=context.openFileOutput(file,
  4. Context.MODE_WORLD_WRITEABLE);
  5. stream.write(msg.getBytes());
  6. stream.flush();
  7. stream.close();
  8. } catch (FileNotFoundExceptione){
  9. } catch (IOExceptione){
  10. }
  11. }

在这里打开文件的时候,声明了文件打开的方式。

一般来说,直接使用文件可能不太好用,尤其是,我们想要存放一些琐碎的数据,那么要生成一些琐碎的文件,或者在同一文件中定义一下格式。其实也可以将其包装成Properties来使用:

  1. public static Propertiesload(Contextcontext,Stringfile){
  2. Propertiesproperties= new Properties();
  3. try {
  4. FileInputStreamstream=context.openFileInput(file);
  5. properties.load(stream);
  6. } catch (FileNotFoundExceptione){
  7. } catch (IOExceptione){
  8. }
  9. return properties;
  10. }
  11. public static void store(Contextcontext,Stringfile,Propertiesproperties){
  12. try {
  13. FileOutputStreamstream=context.openFileOutput(file,
  14. Context.MODE_WORLD_WRITEABLE);
  15. properties.store(stream, "" );
  16. } catch (FileNotFoundExceptione){
  17. } catch (IOExceptione){
  18. }
  19. }
    编程中文件读写是少不了的,如下:

    读:
    public String ReadSettings(Context context){
    FileInputStream fIn = null;
    InputStreamReader isr = null;

    char[] inputBuffer = new char[255];
    String data = null;

    try{
    fIn = openFileInput("settings.dat");
    isr = new InputStreamReader(fIn);
    isr.read(inputBuffer);
    data = new String(inputBuffer);
    Toast.makeText(context, "Settings read",Toast.LENGTH_SHORT).show();
    }
    catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(context, "Settings not read",Toast.LENGTH_SHORT).show();
    }
    finally {
    try {
    isr.close();
    fIn.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return data;
    }

    写:
    public void WriteSettings(Context context, String data){
    FileOutputStream fOut = null;
    OutputStreamWriter osw = null;

    try{
    fOut = openFileOutput("settings.dat",MODE_PRIVATE);
    osw = new OutputStreamWriter(fOut);
    osw.write(data);
    osw.flush();
    Toast.makeText(context, "Settings saved",Toast.LENGTH_SHORT).show();
    }
    catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(context, "Settings not saved",Toast.LENGTH_SHORT).show();
    }
    finally {
    try {
    osw.close();
    fOut.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    使用方法:
    WriteSettings(this,"setting0, setting1, setting2");
    String data[] = ReadSettings(this).split(",");

初学Android, 初学JAVA,很不专业的找了一下相关资料,很不专业的还愣是没看全明白,还是老大给了个方案,照着做,还好没错。

在网上有看到过说写SD卡的路径要双斜杠,如://sdcard//t.txt,但我试下来双斜杠,单斜杠都可以。

写两个小函数,以供调用

删除文件函数,输入参数:文件名(全路径) 如 "/sdcard/test.txt"

public boolean DeleteFile(String filename)
{
File file;

file = new File(filename);
if (file.exists())
file.delete();
else
return false;

return true;
}

写文件函数,输入参数:文件名, 输入缓冲首地址,数据长度
public boolean WriteFile(String filename, char [] str, int length)
{
try
{
FileWriter fw = new FileWriter(filename);
fw.write(str, 0, length);
fw.flush();
fw.close();
}
catch(IOException e)
{
e.printStackTrace();
return false;
}
return true;
}


读文件函数,输入参数:文件名, 读取缓冲首地址,数据长度
public boolean ReadFile(String filename, char [] str, int length)
{
try
{
FileReader fr = new FileReader(filename);
fr.read(str, 0, length);
fr.close();
}
catch(IOException e)
{
e.printStackTrace();
return false;
}
return true;
}

你可能感兴趣的:(android)