Android 获取系统目录路径的完整指南
在 Android 开发中,获取正确的目录路径是文件读写操作的基础。不同 API 返回的路径位置有所差异,有的会自动创建目录,有的则不会。以下详细总结各种目录获取方法及其行为特点。
内部存储路径获取
内部存储相关方法集中在 Context 类中,主要涉及 /data/user/0/packageName/ 下的子目录。
Context context = getApplicationContext();
// 应用私有数据根目录,应用启动后直接存在,不自动创建
String dataDir = context.getDataDir().getAbsolutePath();
// 结果:/data/user/0/com.example.app
// 应用内部文件存储目录,不存在时自动创建
String filesDir = context.getFilesDir().getAbsolutePath();
// 结果:/data/user/0/com.example.app/files
// 应用内部缓存目录,自动创建
String cacheDir = context.getCacheDir().getAbsolutePath();
// 结果:/data/user/0/com.example.app/cache
// 代码缓存目录,自动创建
String codeCacheDir = context.getCodeCacheDir().getAbsolutePath();
// 结果:/data/user/0/com.example.app/code_cache
// 备份排除目录,自动创建
String noBackupDir = context.getNoBackupFilesDir().getAbsolutePath();
// 结果:/data/user/0/com.example.app/no_backup
数据库路径与方法
getDatabasePath(String name) 不会创建数据库文件或目录,仅返回预期路径。注意:调用时需包含 .db 后缀。
// 仅返回路径,不创建任何文件或目录
String dbPath = context.getDatabasePath("mydb.db").getAbsolutePath();
// 结果:/data/user/0/com.example.app/databases/mydb.db
自定义内部目录
通过 getDir(String name, int mode) 可以在应用私有目录下创建自定义文件夹,前缀自动加上 app_。
// 该调用会自动创建目录 /data/user/0/com.example.app/app_custom
File customDir = context.getDir("custom", Context.MODE_PRIVATE);
// 输出:/data/user/0/com.example.app/app_custom
外部存储路径(应用私有)
外部存储路径通常在 /storage/emulated/0/Android/data/packageName/ 下,这些目录会在应用卸载时自动删除。
// 获取外部文件目录,自动创建
String extFiles = context.getExternalFilesDir(null).getAbsolutePath();
// 结果:/storage/emulated/0/Android/data/com.example.app/files
// 传入参数可指定子文件夹,自动创建
String extPics = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath();
// 结果:/storage/emulated/0/Android/data/com.example.app/files/Pictures
// 外部缓存目录,自动创建
String extCache = context.getExternalCacheDir().getAbsolutePath();
// 结果:/storage/emulated/0/Android/data/com.example.app/cache
getExternalFilesDir 与 getExternalFilesDirs 区别
当设备有 SD 卡时,区别明显:
getExternalFilesDir(type):返回主外部存储路径(即手机自带的外部存储分区)。getExternalFilesDirs(type):返回所有可用的外部存储路径数组,包括主外部存储和 SD 卡等扩展存储。
重要:应用卸载时只有主外部存储下的文件会被删除,SD 卡等扩展存储上的文件会保留。
Environment 获取系统级目录
Environment.getDataDirectory().getAbsolutePath(); // /data
Environment.getRootDirectory().getAbsolutePath(); // /system
Environment.getExternalStorageDirectory().getAbsolutePath(); // /storage/emulated/0
Environment.getStorageDirectory().getAbsolutePath(); // /storage
Environment.getDownloadCacheDirectory().getAbsolutePath(); // /data/cache
// 公共目录,无需应用包名
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
// 结果:/storage/emulated/0/Download
关键点总结
getExternalFilesDir()、getDir()等会自动创建目录,getDatabasePath()仅返回路径不创建。- 使用
getDatabasePath()时需包含 .db 后缀。 - 应用卸载时,
getExternalFilesDir()下的文件会被删除,但 SD 卡上其他路径不受影响。 - 传入
null或空字符串给getExternalFilesDir()得到的是 files 根目录,不会创建额外文件夹。