Android那点事

Android数据持久化之文件存储

2017-05-09  本文已影响400人  NickelFox

一. 文件存储路径分类

1. 内部存储

2. 外部存储

3. Android存储结构图(转载自Android文件存储总结

($rootDir)
+- /data                -> Environment.getDataDirectory()
|   |
|   |   ($appDataDir)
|   +- data/com.srain.cube.sample
|       |
|       |   ($filesDir)
|       +- files            -> Context.getFilesDir() / Context.getFileStreamPath("")
|       |       |
|       |       +- file1    -> Context.getFileStreamPath("file1")
|       |   ($cacheDir)
|       +- cache            -> Context.getCacheDir()
|       |
|       +- app_$name        ->(Context.getDir(String name, int mode)
|
|   ($rootDir)
+- /storage/sdcard0     -> Environment.getExternalStorageDirectory()
    |                       / Environment.getExternalStoragePublicDirectory("")
    |
    +- dir1             -> Environment.getExternalStoragePublicDirectory("dir1")
    |
    |   ($appDataDir)
    +- Andorid/data/com.srain.cube.sample
        |
        |   ($filesDir)
        +- files        -> Context.getExternalFilesDir("")
        |   |
        |   +- file1    -> Context.getExternalFilesDir("file1")
        |   +- Music    -> Context.getExternalFilesDir(Environment.Music);
        |   +- Picture  -> ... Environment.Picture
        |   +- ...
        |
        |   ($cacheDir)
        +- cache        -> Context.getExternalCacheDir()
        |
        +- ???

这张图清晰的描述了Android中存储的分类、路径以及访问方式。

二. 应用数据目录详解

 FileOutputStream fos = openFileOutput(FILENAME);  
    fos.write(string.getBytes());
    fos.close();
  - 通过openFileInput(FILENAME, Context.MODE_PRIVATE)方法,获取到FileOutputStream,可以进行文件读入
  - 通过getFilesDir()方法
File file = new File(getFilesDir(), "hello_file2");
   if(!file.exists()){
        file.createNewFile();
    }
    FileOutputStream fos  = new FileOutputStream(file);
    fos.write(string.getBytes());
    fos.close();
  - 两种方法的区别:openFileOutput(Input)返回的是FileOutput(Input)Stream,getFilesDir返回的是File
/* Checks if external storage is available for read and write */
    public boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        }
        return false;
    }
    /* Checks if external storage is available to at least read */
    public boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return true;
        }
        return false;
    }
  - **获取外部存储里面的应用永久存储(/storage/emulate/0/Android/package name/files/)目录**(对于外部存储的私有文件的读写,android4.4及以后并不需要声明特别的权限。但是对于4.4以前需要申明WRITE_EXTERNAL_STORAGE 权限.)
getExternalFilesDir(String type)//type可以是DIRECTORY_PICTURES 之类的, 会返回对应的Pictures 文件夹。或者直接传null会直接返回这个目录的文件夹。
  - **获取外部存储里面的应用缓存数据(/storage/emulate/0/Android/package name/cache/)目录**
getExternalCacheDir()//不需要参数,直接获取到cache目录

三. 公共存储目录

  1. 获取公共存储(/storage/emulated/0/)的方法
    • 公有文件存储必须要声明WRITE_EXTERNAL_STORAGE 权限(危险权限,可能需要动态申请),只是获取路径但是不进行存储的话好像不需要权限。
Environment.getExternalStorageDirectory()//获取到/storage/emulated/0/
Environment.getExternalStoragePublicDirectory("")//获取到/storage/emulated/0/
Environment.getExternalStoragePublicDirectory("path")//获取到/storage/emulated/0/path
上一篇 下一篇

猜你喜欢

热点阅读