Internal Storage

你可以直接向内部存储空间写入数据,默认情况下,保存在内部存储的文件是私有化的而其他应用无法进行访问。当你进行了卸载应用,这些文件将被删除。
创建并写入数据到私有化内部存储:
1、调用openFileOutput()并通过参数文件名和运行模式获取FileOutputStream;
2、通过write()写入数据;
3、通过close()关闭IO流。
code snippet:

String string = "data";
FileOutputStream fos = null;
try {
   fos = openFileOutput(FILE_NAME, MODE_APPEND);
   fos.write(string.getBytes());
} catch (FileNotFoundException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}finally {
   if(fos != null) {
      try {
         fos.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

: FYI
MODE_PRIVATE 运行模式下,会创建文件(如果有相同名字的文件即已经存在这个文件,将会表示这个文件)并且使这个文件对于你的应用来说为私有化。其他模式还有:MODE_APPEND, MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。MODE_APPEND模式为数据会从你已经写入文件中的数据之后继续写入,而不是覆盖。其他两个模式已经在API17被废弃。
读数据:
1、通过openFileInput()并使用文件名去获取FileIniputStream。
2、使用read()方法去读取bytes;
3、调用close()来关闭IO流。
code snippet:

FileInputStream fis = null;
try {
   fis = openFileInput(FILE_NAME);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String str = null;
StringBuffer sb = new StringBuffer();
   while ((str = br.readLine()) != null) {
      sb.append(str);
}
    //TODO
} catch (FileNotFoundException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}finally {
if(fis != null) {
try {
         fis.close();
} catch (IOException e) {
         e.printStackTrace();
}
   }
}

: FYI
如果你想在编译环境使用一个静态的文件,保存这个文件在res/raw文件夹下,你可以使用openRawResource()并通过R.raw.< filename >来获取InputStream,然后读取这个原始文件。比如有如图一个文件:

code snippet:

InputStream fis = null;
try {
   fis = getResources().openRawResource(R.raw.test);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String str = null;
StringBuffer sb = new StringBuffer();
   while ((str = br.readLine()) != null) {
      sb.append(str);
}
// TODO
} catch (FileNotFoundException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}finally {
if(fis != null) {
try {
         fis.close();
} catch (IOException e) {
         e.printStackTrace();
}
   }
}

: FYI

Cache

如果你只是想暂时保留一些数据而不是对它们对持久化存储,你可以使用Cache来短暂性的存储这些数据。当你的设备分配的内存空间不足时,Android会自动删除一些数据而继续保留一定的空间。但是你并不能不主动去做清除动作。按照Google的说法,你应该让你的应用的缓存空间保持剩余,比如1M。当你卸载程序后,缓存会主动被移除。
code snippet:
write:

ObjectOutputStream oos = null;
try {
   File file = new File(MainActivity.this.getCacheDir(), "cache");
   if(!file.exists()) {
      file.createNewFile();
   }
   oos = new ObjectOutputStream(new FileOutputStream(file));
   oos.writeObject(new Test("male", "mli"));
} catch (IOException e) {
   e.printStackTrace();
}finally {
   if(oos != null) {
      try {
         oos.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

: FYI
read:
code snippet:

ObjectInputStream ois = null;
try {
   File file = new File(MainActivity.this.getCacheDir(), "cache");
   if(!file.exists()) {
      file.createNewFile();
   }
   ois = new ObjectInputStream(new FileInputStream(file));
   Test test = (Test)ois.readObject();
   // TODO:
   ois.close();
} catch (IOException e) {
   e.printStackTrace();
} catch (ClassNotFoundException e) {
   e.printStackTrace();
}finally {
   if(ois != null) {
      try {
         ois.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

:FYI
Mode_private模式写入,数据在重复写的过程中会被覆盖。
remark:
//需要实现Serializable接口,当然,按照规定,这个最好写成外部类

class Test implements Serializable {
   private static final long serialVersionUID = 2L;
   String sex;
   String name;

   public Test () {

   }

   public Test(String sex, String name) {
      this.sex = sex;
      this.name = name;
   }
   //ObjectOutputStream会按照toString的格式进行存储
   @Override
   public String toString() {
      return sex + name;
   }
}

很显然,其实上述两种方式的存储方法雷同,只不过存储位置有所改变而已。内部存储存储在/data/data//files目录下,而缓存存储在/data/data//cache目录下。

文章仅供参考,更多,等待探索