Android 系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储、SharedPreference 存储以及数据库存储。
还可以将数据保存在手机的SD 卡中,不过使用以上三种方式来保存数据会更简单一些,而且会更加的安全。
文件存储
存储数据到文件中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件中的,因而比较适合用于存储一些简单的文本数据或二进制数据。
Context类的openFileOutput (String name, int mode)用于将数据存储到指定的文件中。
name为文件名(不包含路径),所有的文件都是默认存储到/data/data/<package name>/files/ 目录下。
mode为文件的操作模式,MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容;
MODE_APPEND 则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。MODE_WORLD_READABLE 和MODE_WORLD_WRITEABLE危险,被弃用。
openFileOutput ()方法返回的是一个FileOutputStream 对象,得到了这个对象之后,可以使用Java 流的方式将数据写入到文件中。
以下是一段简单的代码示例,展示了如何将一段文本内容保存到文件中:
//通过openFileOutput()方法得到一个FileOutputStream对象,然后再借助它构建出一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象,这样就可以通过BufferedWriter来将文本内容写入到文件中了。
public void save() {
String data = "这是一个数据";
FileOutputStream out;
OutputStreamWriter osw;
BufferedWriter writer = null;
try {
out = openFileOutput("文件名.txt", Context.MODE_PRIVATE); //得到一个FileOutputStream对象out
osw = new OutputStreamWriter(out); //构建出一个OutputStreamWriter对象osw
writer = new BufferedWriter(osw); //构建出一个BufferedWriter对象writer
writer.write(data); //通过BufferedWriter的write()方法将文本内容写入到文件中
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bw != null) { //此处,所以bw必须初始化赋值
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
例子A:
布局中仅仅一个EditText。
在文本输入框中随意输入点什么内容,再按下Back 键,这时输入的内容就已经丢失了,因为它只是瞬时数据,在活动被销毁后就会被回收。而以下程序,就是在数据被回收之前,将它存储到文件当中。
以下文件中的"文件名.txt"存储在/data/data/com.example.a/files/目录下
public class MainActivity extends AppCompatActivity {
@BindView(R.id.et_edit)
EditText etEdit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
String text = etEdit.getText().toString();
save(text); //保证在活动销毁之前一定会调用这个方法
}
private void save(String text) {
FileOutputStream out;
BufferedWriter writer = null;
OutputStreamWriter osw;
try {
out = openFileOutput("文件名.txt", MODE_APPEND);
osw = new OutputStreamWriter(out);
writer = new BufferedWriter(osw);
writer.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
从文件中读取数据
Context类的openFileInput(String name)方法。
系统会自动到/data/data/<package name>/files/目录下去加载这个文件,并返回一个FileInputStream 对象,再通过Java 流读取数据。
public String load() {
FileInputStream in;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("文件名.txt");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
例子A是在文本框输入数据,然后退出程序时会保存数据,在A的代码下,加入以下代码,让再次进入程序的时候,刚刚输入的文本还能在文本编辑框显示
1.在onCreate()下添加
load();
etEdit.setText(content.toString());
2.加入读取方法load()
StringBuilder content;
public String load() {
FileInputStream in;
BufferedReader reader = null;
content = new StringBuilder();
try {
in = openFileInput("文件名.txt");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}