Context类中提供了一个openFileOutput()方法,用于数据存储到指定的文件中。此方法接收两个参数(参数名,操作模式)。首先是参数名,它表示文件创建的时候使用的名称。注意路径不能被改变,路径默认存在 /data/data/<packagename>/file/目录。第二是操作模式,主要有两种模式可以选择:MODE_PRIVATE(默认的操作模式,表示如果指定同样文件名的时候,写入的内容将会覆盖原文件内容)和MODE_APPEND(表示如果该文件存在,就会往文件里面追加内容,不存在就创建新文件).openFileOutput()方法返回的是一个FileOutputStream对象,得到了这个对象之后就可以使用java流的方式将数据写入到文件中。
1)将文本内容保存到文件中
public void save(){
String data = "Data to save";
FileOutputStream out = null;
BufferdWriter writer = null;
try{
out = openFileOutput("data",Context.MODE_PRIVATE);//得到一个FileOutputStream对象
//构建出BufferedWriter对象
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(data);//通过BufferedWriter将文本内容
}catch (IOException e){
e.printStackTrace();
}finally {
try{
if(writer != null){
writer.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
2)文件存储FilePersistenceTest项目
首先修改activity_main.xml中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Type something here" />
</LinearLayout>
在布局中加入了一个EditText,用于输入文本内容。当到文本开框输入内容之后,按下返回键,这时候输入内容丢失了。于是我们需要把输入的内容存储到文件当中。修改MainActivity里的代码
public class MainActivity extends AppCompatActivity {
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() {
super.onDestroy();
String inputText = editText.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();
}
}
}
}
这样做仅仅是把EditText输入的文件保存到了文件里,我们下一步要把文件里面的数据读取出来,让下次启动程序的时候让这些数据还原到EditText中
3)从文件中读取数据
跟2)类似,将数据存储到文件中,Context类还提供了一个openFileInput()方法,用于从文件中读取数据。这个方法只接收一个参数:文件名。然后系统会自动到/data/data/<packagename>/file/目录下去加载这个文件,并返回一个FileInputStream对象,得到了这个对象之后在通过JAVA流的方式就可以将数据读取出来。
读取方法:
public String load(){
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try{
in = openFileInput("data");//获取到FileInputStream对象
//构建了一个InputStreamReader对象,再使用InputStreamReader构建出一个BufferedReader对象
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null){
content.append(line);
}
}catch (IOException e){
e.printStackTrace();
}
return content.toString();
}
代码解释:首先通过openFileInput()方法获取到了一个FileInputStream对象,借助它又构建了一个InputStreamReader对象,再使用InputStreamReader构建出一个BufferedReader对象。这样我们就可以通过BuferedReader进行一行行的读取。把文件所有的文本内容全部读取出来,并存放在一个StringBuilder对象中,最后将读取的内容返回就行了。
通过这个文件读取的学习,我们下一步就完善2)的例子,使的重新启动程序时 EditText中能够保留我们上次输入的内容。修改MainActivity中的代码
/**
* 通过onCreate方法调用load()方法来读取文件中存储的文件内容
* 如果读取到内容不为null,就调用EditText的setText()方法将内容填充到EditText里,
* 调用setSelection()方法将输入光标移动到文本的末尾位置以便输入,然后弹出一句还原成功的提示
* load()方法不懂就看前面
*
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
//调用load()方法来读取文件中存储的文件内容
String inputText = load();
//如果读取到内容不为null,就调用EditText的setText()方法将内容填充到EditText里
if (!TextUtils.isEmpty(inputText)){
editText.setText(inputText);
//调用setSelection()方法将输入光标移动到文本的末尾位置以便输入,然后弹出一句还原成功的提示
editText.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
}
}
public String load(){
...................//代码见上面的读取方法
}