Android开发学习进程 0.24 存储机制

Android 的存储机制

Android存储机制较混乱,早期安卓设备均带有SD卡插槽,即存储分为内部存储和外部存储,(注:此内部存储应与内存即主存区分)但现在大部分手机均不支持SD卡,同时系统ROM自动将手机存储空间划分为 内部存储和外部存储,所以即使现在手机没有内存卡,但还是可以区分内部存储和外部存储。
内部存储存储的数据均在包名文件夹下,默认仅有你的应用可以访问,但可以设置文件访问可读,供其他应用访问。SP 和SQLite都存储在这里,访问方法有:
1、Environment.getDataDirectory()
2、getFilesDir().getAbsolutePath()
3、getCacheDir().getAbsolutePath()
4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath()
外部存储在4.4后有所不同,许多手机已经集成了外部存储,但在系统中也会区分内外部存储,如果手机本身区分自带内外部存储,但还插入SD卡后,获取的外部存储会有两条!如果使用以下方式遍历

File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
    for(File file:files){
        Log.e("main",file);
    }
}

可看到两条路径,外部存储获取方法有:
1、Environment.getExternalStorageDirectory().getAbsolutePath()
2、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath()
3、getExternalFilesDir(“”).getAbsolutePath()
4、getExternalCacheDir().getAbsolutePath()

即/data目录下的文件物理上存放在内部存储里面
/storage目录下的文件物理上存放在外部存储里面
/system用于存放系统文件,/cache用于存放一些缓存文件,物理上它们也是存放在内部存储里面的
其他不同获取路径方法:
1、Environment.getDataDirectory() = /data
这个方法是获取内部存储的根路径
2、getFilesDir().getAbsolutePath() = /data/user/0/packname/files
这个方法是获取某个应用在内部存储中的files路径
3、getCacheDir().getAbsolutePath() = /data/user/0/packname/cache
这个方法是获取某个应用在内部存储中的cache路径
4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() = /data/user/0/packname/app_myFile
这个方法是获取某个应用在内部存储中的自定义路径
方法2,3,4的路径中都带有包名,说明他们是属于某个应用
…………………………………………………………………………………………
5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0
这个方法是获取外部存储的根路径
6、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = /storage/emulated/0
这个方法是获取外部存储的根路径
7、getExternalFilesDir(“”).getAbsolutePath() = /storage/emulated/0/Android/data/packname/files
这个方法是获取某个应用在外部存储中的files路径
8、getExternalCacheDir().getAbsolutePath() = /storage/emulated/0/Android/data/packname/cache
这个方法是获取某个应用在外部存储中的cache路径
方法7、8在Android4.4以上才有用,4.4以下当未插入SD卡时可能会返回null。
6.0以上使用getExternalFilesDirs在有内存卡的条件下获取内存卡路径。
Environment.getDownloadCacheDirectory() = /cache
Environment.getRootDirectory() = /system
这两个方法通用
同时注意getFilesDir().getAbsolutePath()和getExternalFilesDir(“”).getAbsolutePath()的不同在于一个获取的是内部存储地址,另一个是外部存储,同时都带有包名,这意味着删除应用后这些文件也将被删除。
应当优先使用外部存储,但是为做好适配需要做判断,在无法使用外部存储时使用内部存储。代码如下:

public static String getFilePath(Context context,String dir) {
    String directoryPath="";
    if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {//判断外部存储是否可用 
        directoryPath =context.getExternalFilesDir(dir).getAbsolutePath();
        }else{//没外部存储就使用内部存储  
        directoryPath=context.getFilesDir()+File.separator+dir;
        }
        File file = new File(directoryPath);
        if(!file.exists()){//判断文件目录是否存在
        file.mkdirs();
        }
    return directoryPath;
}

而在低版本Android 4.0 4.1 4.2中 获取外部存储的文件路径不一,设计Linux的文件挂载,不同用户的文件,作者也没有搞清楚,所以为统一适配,尽量不直接使用文件路径访问。

设置中清除缓存和清除数据

在手机应用管理中,有清除缓存和清除数据这两个按钮,但其与内部存储中/data/user/0/packname/cache 和/data/user/0/packname/files并没有关系,清除缓存是清除app运行过程中读入写入或其他的一些临时数据,
而清除数据则会把内部存储的/data/user/0/packname/以及外部存储的包名下专属存储全部删除。包括cache files sp等。

文章部分资料参考https://blog.csdn.net/s13383754499/article/details/82910704

原文地址:https://www.cnblogs.com/baimiyishu/p/13878154.html