Android数据存储——文件存储

一 。数据存储到文件中

通过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使用平台自己的行分隔符,

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

posted @ 2018-07-27 19:46  Mask_D  阅读(205)  评论(0编辑  收藏  举报