文件存储是安卓三种持久化技术(包括文件存储、SharedPreferences存储和数据库存储)的其中一种,也是最直接最简单的一种,下面来看看它是怎么实现的:
1、将数据存储到文件中
下面通过一个例子,说明一下openFileOutput的用法,以及一些注意事项。
// MainActivity.java -> public class MainActivity
private EditText edittext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edittext = (EditText) findViewById(R.id.edittext);
}
@Override
protected void onDestroy() {
// 获取文本内容
String content = edittext.getText().toString();
store(content);
super.onDestroy();
}
private void store(String content) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = MainActivity.this.openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(content);
writer.flush();
writer.close();
} catch (FileNotFoundException e) {
Log.e("sysu", e.getMessage());
} catch (IOException e) {
Log.e("sysu", e.getMessage());
}
}
要注意的地方:Context.openFileOutput这个函数的第一个参数的意思是文件名,不能添加路径,因为文件默认存储到/data/data/包名/flies目录下;第二个参数是存储模式,主要有两种:MODE_PRIVATE和MODE_APPEND,第一种模式的意思是新写入的文件会覆盖旧文件;第二种模式是新内容不会覆盖,而是添加到旧内容的后面。其实还有MODE_WORLD_READABLE 和MODE_WORLD_WRITEABLE,但由于安全性不高,在Android 4.2之后就被废弃了。
效果:首先在手机上打开应用,输入文本,然后点击返回键退出。
用DDMS查看手机内容,可以看到data文件已经存储到前面说的目录下。
2、从文件中读取数据
有openFileOutput就有openFileInput,下面看看它的用法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edittext = (EditText) findViewById(R.id.edittext);
String content = load();
if (!TextUtils.isEmpty(content)) {
edittext.setText(content);
edittext.setSelection(content.length());
Toast.makeText(MainActivity.this, "加载数据成功!", Toast.LENGTH_LONG).show();
}
}
private String load() {
InputStream in = null;
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
in = MainActivity.this.openFileInput("data");
br = new BufferedReader(new InputStreamReader(in));
sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
}
catch (Exception e) {Log.e("sysu", e.getMessage());}
return sb.toString();
}
load函数的内容比较简单,onCreate里有几个方法需要注意:TextUtil.isEmpty(string)这种方法会把字符串为null和空值都判断为true,从而避免了需要分开考虑这两种问题的麻烦。然后setSelection函数的作用是设置EditText的光标的位置。
最终效果就是每次FilePersistenceTest打开的时候,会自动加载data里面的内容。