Android 本地存储路径说明
一、背景
作为一个开发者,我们经常需要通过缓存一些文件到SD卡中,常见的方式就是,通过:
File sdCard = Environment.getExternalStorageDirectory();
获取SD卡根目录,然后自定义文件/文件名进行文件存储.这样做法的结果就是,当手机安装了大量的app时,SD卡根目录会迅速变得杂乱不堪。并且在API 6.0之后,根目录文件存储是需要用户授权的,就算你在AndroidManifest.xml中配置了存储权限,用户不授权也是写不进去了
SD卡读写权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
其实,Google已经提供了最佳的外部存储方案,那就是统一路径为:
/Android/data/< package name >/files/… (该路径通常挂载在/mnt/sdcard/下)
外部存储路径调用方法是: context.getExternalFilesDir(dir).getAbsolutePath() //通过context调用,
参数dir为自自定义文件夹.这个方法获得的文件存储路径适用于6.0以后系统,主要AndroidManifest.xml配置读写权限了,就不需要用户再授权了.
内部存储路径调用方法是:context().getCacheDir().getAbsolutePath() //通过context调用
二、本地存储路径常用方法介绍
1. getCacheDir()
-
路径:
/data/data/<package_name>/cache/
-
存储类型:内部存储(应用私有目录)。
-
特点:
-
无需权限,应用卸载时自动删除。
-
适合存放临时缓存文件(如图片缓存)。
-
系统可能在存储不足时清理此目录(但依赖系统实现,不保证及时性)。
-
-
示例:
File cacheDir = context.getCacheDir();
2. getFilesDir()
-
路径:
/data/data/<package_name>/files/
-
存储类型:内部存储(应用私有目录)。
-
特点:
-
无需权限,应用卸载时自动删除。
-
适合存放长期使用的私有文件(如用户配置、数据库文件)。
-
系统不会自动清理,需开发者管理。
-
-
示例:
File filesDir = context.getFilesDir();
3. getExternalFilesDir(String type)
-
路径:
/Android/data/<package_name>/files/<type>/
(例如Environment.DIRECTORY_DOWNLOADS
指定子目录) -
存储类型:外部存储(应用私有目录)。
-
特点:
-
从 Android 4.4(API 19)开始无需权限;但若访问其他应用的目录或公共目录(如
DCIM
)仍需权限。 -
应用卸载时自动删除。
-
适合存放媒体文件等较大数据(如音视频、文档)。
-
用户可通过文件管理器直接访问(需注意隐私问题)。
-
-
示例:
-
File externalFilesDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
4. getExternalCacheDir()
-
路径:
/Android/data/<package_name>/cache/
-
存储类型:外部存储(应用私有目录)。
-
特点:
-
与
getExternalFilesDir()
类似,但专用于缓存文件。 -
系统或用户可能手动清理此目录。
-
适合存放临时外部缓存(如下载的临时文件)。
-
-
示例:
File externalCacheDir = context.getExternalCacheDir();
5. Environment.getExternalStorageDirectory()
-
已废弃 (API 29+),建议使用
Context#getExternalFilesDir(String)
或其他存储访问框架 -
返回共享的外部存储根目录 (如
/storage/emulated/0
) -
需要
READ_EXTERNAL_STORAGE
或WRITE_EXTERNAL_STORAGE
权限 -
存储在此处的文件对所有应用可见,用户也可以通过文件管理器访问
-
应用卸载时文件不会被自动删除
三、路径说明和对比
getCacheDir():/data/data/你的应用的包名/cache
getFilesDir():/data/data/你的应用的包名/files
getExternalFilesDir():SDCard/Android/data/你的应用的包名/files/
getExternalCacheDir():SDCard/Android/data/你的应用包名/cache/
从上文每个方法获取的路径中可以看出,getCacheDir()和getFilesDir()是获取手机自带的存储空间中的当前包文件的路径 ;
getExternalFilesDir()和getExternalCacheDir()是获取手机中SD卡的存储控件中的当前包文件的路径。
关键区别总结
区别 | 方法 | 存储位置 | 是否需要权限 | 卸载是否删除 | 系统清理行为 | 适用场景 |
external storage 外部存储 | Environment.getExternalStorageDirectory() | SD卡根目录:/storage/emulated/0 | 是 | 否 | 否 | 已废弃,不建议再使用,推荐使用getExternalFilesDir代替 |
context.getExternalFilesDir(dir) | 路径:/storage/emulated/0/Android/data/<package_name>/files/... | 否(API 19+) | 是 | 否 | 较大的媒体或文档文件 | |
context.getExternalCacheDir() | 路径:/storage/emulated/0/Android/data/<package_name>/cache/... | 否(API 19+) | 是 | 可能(用户/系统) | 外部临时缓存文件 | |
internal storage 内部存储 | context.getFilesDir() | 路径:/data/data/<package_name>/files | 否 | 是 | 否 | 适合存储应用长期使用的私有文件 |
context.getCacheDir() | 路径:/data/data/<package_name>/cache | 否 | 是 | 可能(低存储时) | 内部临时缓存文件 |
注:/data/data/等同于/data/user/0
四、注意事项
1、权限问题
访问外部存储的公共目录(如相册)需 READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE 权限(Android 10+ 分区存储限制)。
私有目录(getExternalFilesDir/getExternalCacheDir)在 API 19+ 无需权限。
2、兼容性:
使用前检查外部存储是否可用:
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
3、存储选择建议:
小文件或敏感数据优先用内部存储(getFilesDir)。
大文件或用户需访问的文件用外部私有目录(getExternalFilesDir)。
4、清理责任:
缓存目录(getCacheDir/getExternalCacheDir)应定期清理,避免占用过多空间。