zoukankan      html  css  js  c++  java
  • Android学习--持久化(一) 文件存储

    持久化之   文件存储


       

           这里把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();
        }
    }
    
  • 相关阅读:
    WCF bindings comparison z
    DevExpress打印功能 z
    使用Topshelf 5步创建Windows 服务 z
    Log4net中的RollingFileAppender z
    Log4Net在Windows服务中不能记录日志 z
    dev 注册方法 z
    async callback z
    多窗体之间方法调用 z
    [JS6] 通过用户事件事件执行脚本
    [JS5] 利用onload执行脚本
  • 原文地址:https://www.cnblogs.com/zhangxiaoxu/p/7299910.html
Copyright © 2011-2022 走看看