类似于将数据存储到文件中,Context 类中还提供了一个 openFileInput()方法,用于从文
件中读取数据。这个方法要比 openFileOutput()简单一些,它只接收一个参数,即要读取的文
件名,然后系统会自动到/data/data//files/目录下去加载这个文件,并返回一个
FileInputStream 对象,得到了这个对象之后再通过 Java 流的方式就可以将数据读取出来了。
以下是一段简单的代码示例,展示了如何从文件中读取文本数据:
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();
}
在这段代码中,首先通过 openFileInput()方法获取到了一个 FileInputStream 对象,然后
借助它又构建出了一个 InputStreamReader对象,接着再使用 InputStreamReader 构建出一个
BufferedReader 对象,这样我们就可以通过 BufferedReader 进行一行行地读取,把文件中所
有的文本内容全部读取出来并存放在一个 StringBuilder 对象中,最后将读取到的内容返回就
可以了。
了解了从文件中读取数据的方法,那么我们就来继续完善上一小节中的例子,使得重新
启动程序时 EditText中能够保留我们上次输入的内容。修改 MainActivity中的代码,如下所示:
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();
if (!TextUtils.isEmpty(inputText)) {
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(this, “Restoring succeeded”,
Toast.LENGTH_SHORT).show();
}
}
……
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();
}
}
可以看到,这里的思路非常简单,在 onCreate()方法中调用 load()方法来读取文件中存储
的文本内容,如果读到的内容不为空,就调用 EditText 的 setText()方法将内容填充到 EditText
里,并调用 setSelection 方法将输入光标移动到文本的末尾位置以便于继续输入,然后弹出
一句还原成功的提示。load()方法中的细节我们前面已经讲过了,这里就不再赘述。
注意上述代码在对字符串进行非空判断的时候使用了 TextUtils.isEmpty()方法,这是一
个非常好用的方法,它可以一次性进行两种空值的判断。当传入的字符串等于 null或者等于
空字符串的时候,这个方法都会返回 true,从而使得我们不需要单独去判断这两种空值,再
使用逻辑运算符连接起来了。
现在重新运行一下程序,刚才保存的 Content 字符串肯定会被填充到 EditText 中,然后编写
一点其他的内容,比如在 EditText 中输入 Hello,接着按下 Back 键退出程序,再重新启
动程序,这时刚才输入的内容并不会丢失,而是还原到了 EditText中
这样我们就已经把文件存储方面的知识学习完了,其实所用到的核心技术就是 Context
类中提供的 openFileInput()和 openFileOutput()方法,之后就是利用 Java 的各种流来进行读写
操作就可以了。
不过正如我前面所说,文件存储的方式并不适合用于保存一些较为复杂的文本数据,因
此,下面我们就来学习一下 Android 中另一种数据持久化的方式,它比文件存储更加简单易
用,而且可以很方便地对某一指定的数据进行读写操作。