1、外部存储
作为一个开发者,我们经常需要通过缓存一些文件到 SD 卡中,常见的方式就是,通过:
File sdCard = Environment.getExternalStorageDirectory();
获取 SD 卡根目录,然后自定义文件/文件名进行文件存储,这样做法的结果就是,
当手机 安装了大量的 app 时,SD 卡根目录会迅速变得杂乱不堪,并且在 API 6.0 之后,根目录文件 存储是需要用户授权的,
即使在 AndroidManifest.xml 中配置了存储权限,也是需要动态授 权的,用户不授权也是无法使用的,这里就不赘述授权问题了。
那么 Google 这时提供了最佳的外部存储方案,也就是统一路径为:
/Android/data/< package name >/files/... (该路径通常挂载在/mnt/sdcard/下) 外部存储路径调用方法是:
context.getExternalFilesDir(String type).getAbsolutePath()
//通过 context 调用, 传入的参数是 Environment 类中的 Environment.XXX 静态变量,比 如 Environment.DIRECTORY_MOVIES 等。
或者使用 context.getExternalFilesDir().getAbsolutePath() 这个方法获得的文件存储路径适用于 6.0 以后的系统,只要 AndroidManifest.xml 配置读 写权限了,不需要用户再授权了。
2、内部存储
以上,是关于外部存储的介绍,那么如果有些手机没有 SD 卡或者系统自身没有分配外 部存储空间时,我们应该怎么缓存数据呢?那就需要用到内部存储了,内部存储的路径是:
/data/data/< package name >/files/...(该路径挂载在在手机自身存储目录) 内部存储路径调用方法是:
context().getCacheDir().getAbsolutePath() //通过 context 调用
因此,很多开发中获取存储路径的方法是:
public static String getFilePath(Context context,String dir) {
String directoryPath="";
//判断 SD 卡是否可用
if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {
directoryPath =context.getExternalFilesDir(dir).getAbsolutePath() ;
// directoryPath =context.getExternalCacheDir().getAbsolutePath() ;
else{
//没内存卡就存机身内存
directoryPath=context.getFilesDir()+File.separator+dir;
// directoryPath=context.getCacheDir()+File.separator+dir;
}
File file = new File(directoryPath);
if(!file.exists()){
//判断文件目录是否存在
file.mkdirs();
}
return directoryPath;
}
其中 getExternalCacheDir()与 getCacheDir()的区别。
就像 getExternalFilesDir()及 getFilesDir()的区别相同,前者只是在路径下自动建好了一个 cache
文件目录: /data/< package name >/files/cache/...
2、存储示意图 | ||
区别 | 方法 | 路径与备注 |
external storage 外部存储 | Environment.getExternalStorageDirectory() | SD 卡根目录:/mnt/sdcard/ (6.0 后写入需要用户授权) |
context.getExternalFilesDir(dir) | /mnt/sdcard/Android/data/< package name >/files/... | |
context.getExternalCacheDir() | /mnt/sdcard/Android/data/< package name >/cache/... | |
internal storage 内部存储 | context.getFilesDir() | /data/data/< package name >/files/... |
context.getCacheDir() | /data/data/< package name >/cache/... | |