zoukankan      html  css  js  c++  java
  • 流文件存储

    一、流文件存储

    1、基本方法简介

    Android如果需要存储大量的数据,需要使用到文件存储

    用来保存数据的方法为:openFileOutput(String name, int mode)

    其中,name参数表示文件的明成,如果文件不存在,则直接创建,文件的存储位置为:/data/data/包名/files/文件目录,mode表示待存储文件的模式。

    mode模式:

    MODE_PRIVATE:表示私有文件,该文件只能被创建他的文件所访问
    
    MODE_APPEND:表示新的存储内容会添加在原有文件内容的后面。
    
    MODE_WORLD_READABLE:表示该文件能被所有的文件读取,但是不可以写入。
    
    MODE_WORLD_WEITABLE:表示该文件能被所有的文件写入,也可以读取

    用来查询数据的方法为openFileInput(String name),其中name参数表示文件的名称

    注意:用来保存数据和查询数据的方法名与现实思维理解是相反的

    向文件中保存数据的流程:

    待输入数据(文本等)—>转化为字节数组—>字节数组—>加入FileOutputStream—>FileOutputStream—>存入文件—>文件

    从文件中查询数据的流程图:

    文件—>转为FileInputStream—>FileInputStream—>FileInputStream取出字节数组—>字节数组—>转为数据—>数据

    try{
    
        String string ="111";
    
        //将内容转化为自己数组
    
        byte[] buffer = string.getBytes();
    
        //创建文件输出流及文件demo.text
    
        FileOutputStream fos = openFileOutput("demo.txt",MODE_PRIVATE);
    
        //将自己数组通过文件输出流存入demo.txt
    
        fos.write(buffer);
    
        //关闭文件输出流
    
        fos.close();
    
    }catch(Exception e){
    
        e.printStackTrace();
    
    }

    除了可以将文件保存在默认的位置外(/data/data/包名/files/),还可以保存在其他位置:

    比如

    (1)存储到/data/data/(本工程的包名)/demo.txt中:

    File myfile = new File("/data/data/包名/demo.txt");
    
    FileOutputStream fos = new FileOutputStream(myfile);

    注意:只能存储到本工程的包名文件夹下面

    (2)存储到sdcard中:

    String path = Enviroment.getDownloadCacheDorectory().getPath();
    
    File myfile = new File(pah+"demo.txt");
    
    FileOutputStream fos = new FileOutputStream(myfile);

    此外,还需要添加与SD卡相关的权限。

    查询文本的核心代码:

    try{
    
        //区的文件,并肩文件中的字节数组放入文件输入流中
    
        FileInputStream fis = openFileInput("demo.txt");
    
        //取得文件的大小,available()方法可以取得FileInputStream文件输出流的大小
    
        int length = fis.available();
    
        //设置缓冲字节数组,与文件大小相同
    
        byte[] buffer = new byte[length];
    
        //将文件输入流中的字节数组放入缓冲节数组
        fis.read(buffer);
    
        //我下两种方法是将缓冲字节数组转化为文本
    
        //String queryResult = new String(buffer,"UTF-8");
    
        String queryResult=EncodingUtils.getString(buffer,"UTF-8");
    
        fis.close();
    
    }catch(Exception e){
    
        e.printStackTrace();
    
    }

    小知识:

    //读取raw资源文件夹下面的内容
    
    Resources myres = getResources();
    
    InputStream is = myres.openRawResource(R.raw.demo1);
    
    //读取Assets文件夹下的内容
    
    Resources myres = getResources();
    
    InputStream is = myres.getAssets().open(filename);
    
    //读取sdcard文件夹下的内容
    
    File file = new File("/sdcard/filename");
    
    FileInputStream fis = new FileInputStream(file);
    
    //读取特定未知的文件
    
    File file = new File("/data/data/包名/filename");
    
    FileInputStream fis = new FileInputStream(file);

    一、文件存储

    1.将数据存储到文件中

    Context类提供了一个openFileOutput()方法,可用于将数据存储到指定的文件中,这个方法接收两个参数,第一个是参数名,在文件创建的时候就是使用的这个名称,第二个参数是文件的操作方式,一个是MODE_PRIVATE(是默认时的操作方式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容)和MODE_APPEND(表示如果该文件已存在,就往文件里追加内容,不存在就创建新文件)

    openFileOutput()方法返回一个FileOutputStream对象,得到这个对象之后就可以使用JAVA流的方式将数据写入到文件中了

    保存:

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        String inputText=edit.getText().toString();
        save(inputText);
    }
    private void save(String inputText) {
        // TODO Auto-generated method stub
        FileOutputStream out=null;
        BufferedWriter writer=null;
        try{
            out=openFileOutput("data", Context.MODE_PRIVATE);
            //用openFileOutput方法得到一个FileOutputStream对象
            writer=new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);
            //通过BufferedWriter将文本写入到文件夹中
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try{
                if(writer!=null){
                    writer.close();
                }
            }catch(IOException e){
            e.printStackTrace();
            }
        }
    }

    提取

    String inputText=load();
    if(!TextUtils.isEmpty(inputText)){
        //判断是否为空,TextUtils.isEmpty()方法可以一次性进行两种空值的判断,当传入的字符串
        //等于null或者等于空字符串的时候都会返回true,从而不需要单独去判断这两种空值
        edit.setText(inputText);
        //就把读取的内容添加到EditText中
        edit.setSelection(inputText.length());
        //调用这个方法将输入的光标移动到文本的末尾以便于继续输入
        Toast.makeText(this, "Restoring succeeded",Toast.LENGTH_SHORT).show();
    
        private String load() {
            FileInputStream in=null;
            BufferedReader reader=null;
            StringBuilder content=new StringBuilder();
            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();
        }
    }

      

  • 相关阅读:
    java web分享ppt大纲 -- servlet容器简介
    Docker入门二
    Docker入门
    自动化运维
    堡垒机
    代码管理平台
    NoSQL(四)
    NoSQL(三)
    NoSQL(二)
    CentOS添加新网卡network-scripts目录下找不到网卡配置文件
  • 原文地址:https://www.cnblogs.com/chhom/p/4762594.html
Copyright © 2011-2022 走看看