本篇文章主要讲解数据存储中的文件存储。
序言
什么是数据持久化?就是将那些内存中的瞬时数据保存在存储设备中,当手机关机时,数据仍然不会丢失。Android主要提供了3种方式用于简单地实现数据持久化功能,即文件存储、SharedPreferences存储以及数据库存储。下面将一一讲解这三种方式实现数据持久化。
文件存储
文件存储是Android中最基本的数据存储方式,适用于存储一些简单的文本数据或二进制数据。
1、将数据存储到文件中
首先建立一个新的项目:FilePersistenceTest。
修改activity_main.xml中的代码,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:///apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入内容"
/>
<Button
android:id="@+id/save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"
/>
<Button
android:id="@+id/load"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="加载"
/>
</LinearLayout>
修改MainActivity.java代码,如下:
Context类提供了一个openFileOutput()方法,可以将数据存储到指定的文件中,这个方法有两个参数,第一个参数是文件名,注意不可以包含路径;第二个参数是文件的操作模式,MODE_PRIVATE是默认。表示当指定同样文件名的时候,会覆盖原文件内容。
重写了onDestroy()方法,这样可以保证活动在销毁之前一定调用这个方法,并且在onDestroy()方法里获取EditText输入的内容,并调用save()方法把输入的内容存储到文件中,文件命名为data,而save方法中就是java中写文件的操作。
public class MainActivity extends AppCompatActivity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
Button save = (Button)findViewById(R.id.save);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String inputText = edit.getText().toString();
save(inputText);
}
});
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行程序,输入一些内容,然后按下保存,这时我们输入的内容就已经保存到文件中了。
2、从文件中读取数据
Context类中还提供了一个openFileInput()方法,用于从文件读取数据,只接受一个参数,即要读取的文件名。
修改MainActivity.java代码,如下:
其中,新增了加载按钮的点击事件。
思路:load()方法用来读取文件中存储的文本内容,如果不为null,则调用EditText的setText()方法将内容填充到EditText里,并调用setSelection()方法将输入光标移动到文本的末尾位置便于继续输入。
TextUtils.isEmpty()方法可以一次性进行两种空值的判断,当传入的字符串等于null或等于空字符串的时候,返回true。
public class MainActivity extends AppCompatActivity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
Button save = (Button)findViewById(R.id.save);
Button load = (Button)findViewById(R.id.load);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String inputText = edit.getText().toString();
save(inputText);
}
});
load.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String inputText = load();
if (!TextUtils.isEmpty(inputText)) {
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(MainActivity.this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String load() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
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();
}
}
效果如下:
退出程序,点击加载,即可从文件中读入然后自动输入到输入框中。
至此文本存储已经完成,文本存储不适用用于保存复杂的文本数据,下篇文章将学习比文件存储更简单易用的数据持久化方式。