/我挥舞着键盘和本子,发誓要把世界写个明明白白/
安卓提供了三种数据持久化技术,分别为:文件存储、SharedPreference、数据库存储。
一,文件存储
1)文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。
2)Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。这个方法接收2个参数,第一个参数是文件名,所有文件都是默认存储到/data/data//files/;第二个参数是文件的操作模式,有两种模式可选,MODE_PRIVATE(表示指定同样文件名的时候,所写入的内容将会覆盖原文件的内容)和MODE_APPEND(表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件)。openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象后就可以使用JAVA流的方式将数据写入到文件中了。
3)Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。它接收一个参数,即要读取的文件名,然后系统会自动到/data/data//files/目录下去加载这个文件,并返回一个FileInputStream对象,得到了这个对象之后再通过JAVA流的方式将数据读取出来。
下面就编写一个完整的例子,首先创建一个FilePersistenceTest项目,修改activity_main 代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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="Type something here" />
</LinearLayout>
这里只是简单的添加一个EditText,用于输入文本内容。运行一下程序,界面上肯定有一个文本输入框,然后在文本输入框中随意输入点什么内容,再按下Back键,这时输入的内容肯定就已经丢失了,因为它只是瞬时数据,在活动被销毁后就会被回收。而我们想做的,就是在数据被回收之前,将它存储到文件当中。然后再从文件中读取保存的数据,使得重新启动程序时EditText中能够保留我们上次输入的内容。修改MainActivity中的代码,如下:
package com.example.filepersistencetest;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //加载布局文件
edit=(EditText) findViewById(R.id.edit); //文本输入框实例化
String inputText=load(); //调用读取函数load(),读取文件中存储的文本内容
if(!TextUtils.isEmpty(inputText)){ //如果读到的内容不为空
edit.setText(inputText); //将内容填充带EditText里
edit.setSelection(inputText.length()); //调用setSelection()将输入光标移到到文本的末尾以便继续输入
Toast.makeText(this,"Restoring succeeded",Toast.LENGTH_SHORT).show(); //调用Toast.makeText()方法,弹出还原成功的提示。
}
}
@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); //通过openFileOutput()方法得到FileOutputStream对象
writer=new BufferedWriter(new OutputStreamWriter(out)); //借助out,再构建一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象
writer.write(inputText); 调用BufferedWriter的write()方法进行写数据;
}
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"); //通过openFileInput()方法获取一个FileInputStream对象
reader=new BufferedReader (new InputStreamReader(in)); //借助in,构建出一个InputStreamReader对象,接着使用InputStreamReader构建出一个BufferedReader对象
String line="";
while((line=reader.readLine())!=null){ //调用reader的readLine()方法,可以读取文件数据一行的内容,当读取的内容不为空,就把那行的数据添加到content里。
content.append(line);
}
}
catch (IOException e){
e.printStackTrace();
} finally{
if (reader!=null){ 数据读取完毕,关闭输出源。
try{
reader.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
return content.toString(); //文件读取的内容全部存放在一个StringBuilder对象中,最后将读取到的内容返回。
}
}
现在重新运行一下程序,在EditText中输入 You are a good boy ,接着按下Back键退出程序,再重新启动程序,这时刚才输入的内容并不会丢失,而是还原到了EditText中,如图1。你也可以借助DDMS的File Explorer来查看是否我们输入的内容保存到指定的文件中了。切换到DDMS视图,并点击File Explorer切换卡,在这里进入/data/data/com.example.filepersistencetest/files/目录下,可以看到生成了一个data文件,如图2。点击图3最左边的按钮可以将这个文件导出到电脑上。使用记事本打开这个文件,里面内容如图4所示。
图1
图2
图3