持久化之 文件存储
这里把Android持久化全都整理一下,这一篇文章先简单的说一下文件的存储,通过下面一个简单的Demo,理解一下这个文件存储,先说说下面Demo的思路:
1、创建EditText,检查本地是否有存储的文件数据,有的话就直接显示,没有就默认创建
2、EditText输入文字,在这个活动销毁之前存储数据
3、活动启动出现之前读取存储的数据
这样一个简单的存储和读取的整个过程我们就完全体现
Demo效果
先看看这整个效果,我们在这个输入框中输入相应的内容,然后在按下返回键,在onDestroy方法中(活动销毁一定会执行这个方法)把我们的数据保存,在加载这个布局的时候,你先判断有没有存储的数据,要有的话就直接显示你存储的数据:
文件存储
很简单的利用文件存储,总结一下文件存储的过程:
1、Context 类中提供了一个 openFileOutput() 方法,可以用于将内容存储到指定的文件当中,这个方法接收两个参数,第一个参数是文件名,第二个参数是文件的操作模式,在下面的代码中有详细的介绍,这里再说一次:
MODE_PRIVATE 是默认的操作,表示当指定同样文件名的时候,所写入的内容将会覆盖掉源文件当中的内容
MODE_APPEND 表示文件存在就往文件里面添加,要是不存在就创建新的文件
2、上面的方法返回的是一个FileOutputstream 对象,得到这个对象之后构造出一个OutputStreamWriter,代码中的OutputStreamWriter(out)就是构造对象方法
3、得到这个OutputStreamWriter对象之后,再用它构造出一个BufferedWriter对象,代码中的 writer = new BufferedWriter(new OutputStreamWriter(out)) 就是最上面两步步骤的总结。
4、得到这个BufferedWriter对象之后,你就可以利用BufferedWriter对象的Write()方法将数据写进文件
文件读取
上面说的是文件存储的步骤,这里在总结一下读取的时候的步骤;
1、 和上面的存储类似,你用openFileInput() 方法得到一个FileInputstream对象,这个openFileInput()方法传递的至于一个参数。就是文件的名字
2、得到这个FileInputstream对象之后,你再拿着它构造一个InputStreamWriter对象,和上面的类似,调用的是InputStreamWriter(),方法,这个方法传递的就是得到的FileInputstream对象
3、得到InputStreamWriter对象之后,利用这个对象获取到一个BufferedReader对象,reader = new BufferedReader( new InputStreamReader(in)) 这一句代码也是涵盖了上面两个步骤
4、这样我们就通过这个BufferedReader对象的readLine()方法得到我们存储的文件内容
NOTE ***** 说了这么多,其实存储和读取的区别,方法步骤你也能看到都类似,记住 Out 是存储 In 是读取,其他的类似就可以了
Demo源码
public class MainActivity extends AppCompatActivity { EditText textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (EditText) findViewById(R.id.TextView); String content = loaddata(); // if (textView.getText().toString().isEmpty()){ textView.setText(content); textView.setSelection(content.length()); Toast.makeText(this,"读取存储消息成功",Toast.LENGTH_SHORT).show(); } } @Override protected void onDestroy() { super.onDestroy(); // 获取到这个输入框的文字把它存储起来 String content = textView.getText().toString(); saveData(content); } // 写一个保存数据的方法 // try catch finally 写法的说明 // 代码块在try 中执行,要是有异常抛出,则进入catch块中, 完了之后再执行finally块的代码 private void saveData (String content){ FileOutputStream out = null; BufferedWriter writer = null; try { // MODE_PRIVATE 是默认的操作,表示当指定同样文件名的时候,所写入的内容将会覆盖掉源文件当中的内容 // MODE_APPEND 表示文件存在就往文件里面添加,要是不存在就创建新的文件 out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(content); }catch (IOException e){ //e.printStackTrace();是打印异常的堆栈信息,指明错误原因,其实当发生异常时,通常要处理异常, // 这是编程的好习惯,所以e.printStackTrace()可以方便你调试程序! e.printStackTrace(); }finally { try{ if (writer != null){ writer.close();; } }catch (IOException e){ e.printStackTrace(); } } } // 读取数据 private String loaddata(){ FileInputStream in = null; BufferedReader reader = null; StringBuffer content = new StringBuffer(); 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(); } }