一 。数据存储到文件中
通过openFileOutput()方法来讲数据存储到指定的文件中。接收两个参数,第一个参数是存储的文件名,第二个参数是文件操作模式。openFileOutput()返回的是一个FileOutputStream对象(字节输出流)。
存储代码如下:
1 public void save(String inputTest) {
2 FileOutputStream out = null; //字节
3 BufferedWriter writer = null; //字符缓冲输出流
4 try{
5 out = openFileOutput("data", Context.MODE_PRIVATE);
6 writer = new BufferedWriter(new OutputStreamWriter(out));//OutputStreamWrite()是将字符流转化为字节流
7 writer.write(inputTest);
8 } catch (IOException e) {
9 e.printStackTrace();
10 }finally {
11 try{
12 if (writer!=null)
13 writer.close();
14 } catch (IOException e) {
15 e.printStackTrace();
16 }
17 }
18 }
其中先新建一个字节输出流,新建一个字符缓冲输出流。out是一个字节输出流。通过OutputStreamWrite()将BufferedWriterd转化为字节流,然后载入inputTest要存储的数据。
二。数据存入的时机
因为是避免退出和切换后导致的数据丢失,所以要重写onDestroy方法和onPause方法。调用之前写的save方法来保存临时数据。
1 @Override
2 protected void onDestroy() {
3 super.onDestroy();
4 String inputText = editText.getText().toString();
5 save(inputText);
6 }
7
8 @Override
9 protected void onPause() {
10 super.onPause();
11 String inputText = editText.getText().toString();
12 save(inputText);
13 }
三。读取存入的数据
从文件中读取文本数据时,同样先创建一个字节输入流(fileinputstream)为空,创建一个缓冲方式文本读取(BufferedReader)为空,然后创建一个stringbuilder的数据类型的content来存放。
然后在为字节输入流in通过openFileinput方法获得一个Fileinputstream对象,通过inputstreamreader转换字节流为字符流,通过BuffereReader从字符流中读取数据。
然后判断读缓冲方式的文本读取是否为空,不为空则加入到content里。代码整体如下:
1 public String load() {
2 FileInputStream in = null;
3 BufferedReader reader = null;
4 StringBuilder content = new StringBuilder();
5 try {
6 in = openFileInput("data");
7 reader = new BufferedReader(new InputStreamReader(in));
8 String line = "";
9 while ((line = reader.readLine()) != null) {
10 content.append(line);
11 }
12 } catch (IOException e) {
13 e.printStackTrace();
14 }finally {
15 if(reader!=null){
16 try{
17 reader.close();
18 }catch (IOException e){
19 e.printStackTrace();
20 }
21 }
22 }
23 return content.toString();
24 }
启用时,写在oncreate()方法里面,如下:
1 protected void onCreate(Bundle savedInstanceState) {
2 super.onCreate(savedInstanceState);
3 setContentView(R.layout.activity_main);
4 editText = (EditText) findViewById(R.id.edit);
5 String inputText = load();
6 if (!TextUtils.isEmpty(inputText)) {
7 editText.setText(inputText);
8 editText.setSelection(inputText.length());
9 Toast.makeText(this, "Restoring succeeeded", Toast.LENGTH_LONG).show();
10 }
11 }
判断inputText为文件中读取的内容,如果读取的内容不为空,则设置输入框中内容为读取内容,而且将光标设置到长度的最后一位,并显示相应的提示消息。
四。相关类型
InputStream、InputStreamReader、BufferedReader的区别
1.InputStream、OutputStream
处理字节流的抽象类
InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等.
OutputStream是字节输出流的所有类的超类,一般我们使用它的子类,如FileOutputStream等.
2.InputStreamReader OutputStreamWriter
处理字符流的抽象类
InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流.
OutputStreamWriter是字符流通向字节流的桥梁,它将字符流转换为字节流.
3.BufferedReader BufferedWriter
BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,readLine读取一个文本行,
从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
BufferedWriter 由Writer 类扩展而来,提供通用的缓冲方式文本写入, newLine使用平台自己的行分隔符,
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。