持久化技术--文件存储

作者: 大话程序 | 来源:发表于2016-05-10 08:44 被阅读79次

    持久化技术--文件存储

    文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何格式化的处理,所有的数据都是原封不动的存储到文件中,因而适合存储一些简单的文本数据或者二进制数据

    文件存储的核心技术:使用Context类中提供的openFileInput()openFileOutput()方法

    将文件存储到文件中

    使用文件存储,存储的默认路径为(且不能更改):/data/data/<packageName>/files/目录下

    • Context类中提供了一个openFileOutput(String name, Int mode)方法,在文件存储技术中实现数据的存储<name: 文件名称 mode:文件的操作模式>

    文件的操作模式,主要有两种模式可以选择:MODE_PRIVATE(默认的操作模式):表示当指定同样文件名的时候,所写的内容将会覆盖原文件中的内容;MODE_APPEND:表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件

    指定的文件名不可以包含路径

    代码如下:

    /**当活动销毁的时候,将界面上的文本框内的内容利用文件存储技术存储到文件中*/
    public class MainActivity extends Activity {
        
        private EditText edit;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //假设界面上有一个输入文本框
            edit = (EditText) findViewById(R.id.edit);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            String inputText = edit.getText().toString();
            save(inputText);
        }
    
        public void save(String inputText) {
            BufferedWriter writer = null;
            try {
                //通过Context类的openFileOutput方法拿到文件的输出字节流,将此字节流包装为带缓冲区的字符输出流
                writer = new BufferedWriter(new OutputStreamWriter(openFileOutput("data", Context.MODE_PRIVATE)));
                writer.write(inputText);
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                try {
                    if (writer != null) {
                        writer.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    

    从文件中读取数据

    使用文件存储功能取出数据,默认的路径(不可更改)是/data/data/<packageName>/files/

    • Context类中提供了一个openFileInput()方法,得到文件字节输入流

    更改以上代码:(在onCreate()中增加代码并增加一个成员方法):

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            edit = (EditText) findViewById(R.id.edit);
            String inputText = load();
            //使用TextUtils类的isEmpty方法进行双重判断,文本内容为null或者为空字符串则返回true
            if (!TextUtils.isEmpty(inputText)) {
                edit.setText(inputText);
                //将光标移到文本最后
                edit.setSelection(inputText.length());
                Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
            }
        }
    
        public String load() {
            BufferedReader reader = null;
            StringBuilder content = new StringBuilder();
            try {
                //通过Context类的openFileInput()方法获得文件输入字节流,通过包装得到带缓冲区的字符串输入流
                reader = new BufferedReader(new InputStreamReader(openFileInput("data")));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    content.append(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return content.toString();
        }
    

    使用API获取内存存储路径

    • /data/data/(packageName)/files/)获取此路径对象,使用方法
      public File getFilesDir ()
    • /data/data/(packageName)/cache/)获取此路径对象,使用方法
      public File getCacheDir()

    当内部存储空间存储不足时,cache文件夹下的文件会被删除

    使用API获取外部存储路径(sd卡真实路径)

    • (storage/sdcard0/)获取此路径对象,使用方法:
      File Environment.getExternalStorageDirectory()

    使用API获取外部存储的状态

    使用Environment.getExternalStorageState()获取状态,常见状态:

    • Environment.MEDIA_UNKNOWN:表示不能识别sd卡
    • Environment.MEDIA_REMOVED:表示没有sd卡
    • Environment.MEDIA_UNMOUNTED:表示sd卡存在但是没有挂载
    • Environment.MEDIA_CHECKING:表示sd卡正在准备
    • Environment.MEDIA_MOUNTED:表示sd卡挂载,正常使用

    使用API获取外部存储设备的容量

    存储设备都是分块的

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //获取外部存储空间路径
            File path = Environment.getExternalStorageDirectory();
                  //创建StatFs对象,此对象可获得存储信息
            StatFs stat = new StatFs(path.getPath());
            
            long blockSize;
            long availableBlocks;
    
            //判断当期系统使用的版本号
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
                //这两个方法只有在 API level 18及以上才可以使用
                           //获得存储设备分块大小
                blockSize = stat.getBlockSizeLong();
                           //获得存储设备可用分块数量
                availableBlocks = stat.getAvailableBlocksLong();
            }else {
                blockSize = stat.getBlockSize();
                availableBlocks = stat.getAvailableBlocks();
            }
    
            TextView tv = (TextView) findViewById(R.id.tv);
            tv.setText(formatSize(availableBlocks * blockSize));
            
        }
            //将存储设备可用大小转换成合适的单位
        private String formatSize(long size){
            return Formatter.formatFileSize(this, size);
        }
    
    }
    

    相关文章

      网友评论

        本文标题:持久化技术--文件存储

        本文链接:https://www.haomeiwen.com/subject/fvuerttx.html