知识点目录
知识点回顾
6.1 持久化技术简介
保存在内存中的数据是处于瞬时状态的,而持久化技术就是将内存中的瞬时数据保存到存储设备中,保证即使手机或者电脑关机的情况下,这些数据仍然不会丢失。持久化技术提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换。
Android主要提供了3种方式用于实现数据持久化功能:
-
文件存储
-
SharedPreferences存储
-
数据库存储
当然也可以存储到手机SD卡中,但使用上面的三种来保存数据会相对简单一些,也比存储在SD卡中更加安全。
6.2 文件存储
文件存储是Android中最基本的一种数据存储方式,有如下特点:
-
不会对存储的内容进行任何格式化处理,所有数据都是原封不动地保存到文件中
-
适合存储一些简单的文本数据或二进制数据
-
如果来保存一些较为复杂的文本数据,就需要定义一套自己的格式规范
6.2.1 将数据存储到文件中
Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。该方法接收两个参数:
参数一:文件名。文件不可包含路径,因为所有的文件都是默认存储到/data/data//files/目录下。
参数二:文件的操作模式。有MODE_PRIVATE和MODE_APPEND两种
MODE_PRIVATE
默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容。
MODE_APPEND
如果文件已经存在,则直接在文件中追加内容,不存在就创建新的文件。
代码示例:
public class MainActivity extends AppCompatActivity {
private EditText mEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edit);
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = mEditText.getText().toString();
//保存数据
save(inputText);
}
private 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 (Exception e) {
e.printStackTrace();
}
}
}
}
在onDestroy()方法中获取EditText中输入的内容,并调用save()方法把输入的内容存储到文件中,文件名为data。
运行效果:
查看文件
我们可以借助Android Device Monitor工具来查看。
打开Android Device Monitor后,进入File Explorer标签页,找到/data/data/com.example.filepersistencetest/files/目录即可看到data文件。
通过右上角的导出按钮,可以将文件导出到电脑上查看刚才保存的文件内容。
6.2.2 从文件中读取数据
Context类中提供了一个openFileInput()方法,用于从文件中读取数据。该方法只接收一个参数,即要读取的文件名。
代码示例:
public class MainActivity extends AppCompatActivity {
private EditText mEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edit);
String inputText = load();//加载数据
if (!TextUtils.isEmpty(inputText)) {
mEditText.setText(inputText);
mEditText.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
}
}
private 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 {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return content.toString();
}
}
划重点:
-
setSelection()方法将输入光标移动到文本的末尾位置以便于继续输入。
-
TextUtils.isEmpty()方法可以一次性进行两种判空(传入的字符串等于null或者等于空字符串)。
运行效果: