Android数据存储——文件存储

mac2022-06-30  112

一 。数据存储到文件中

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

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

转载于:https://www.cnblogs.com/Mask-D/p/9379393.html

最新回复(0)