Android文件存储路径

注意点

  • 使用内部存储应用卸载后,存储的文件自动删除
  • 使用外部存储要申请权限,并且要判断外部存储是否可用

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
}

context.getCacheDir

1
File cacheDir = context.getCacheDir();

特点

  • 应用内部存储空间
  • 数据文件私有
  • 不需要申请权限
  • 当应用被卸载的时候,目录下的文件会被删除
  • 存储小文件

需要注意的是,这个文件的目录和应用的存储位置有关,
当应用被移动到外部存储设备的时候,文件的绝对路径也是变化的,所以建议当数据存储到这个目录的时候,用相对路径。

这个目录和getFilesDir()目录最大的不同在于:当安卓设备的存储空间少,或者不够用的时候,系统会自动删除这个目录下的文件。

官方建议是,超过1MB的文件,建议存储到getExternalCacheDir()目录下

context.getExternalCacheDir

1
File externalCacheDir = context.getExternalCacheDir();

特点

  • 应用外部存储空间
  • 数据文件私有
  • 需要申请权限(READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
  • 需要判断外部存储的挂载状态(getExternalStorageState(File)
  • 当应用被卸载的时候,目录下的文件会被删除
  • 存储大文件

当应用被卸载的时候,目录下的文件会被删除,但是这里和getCacheDir()还有不同之处:

只有手机系统使用的是虚拟外部存储(虚拟SD卡)的时候,才可以在卸载应用的同时,自动删除该目录下的文件
如果是之前的物理存储(物理SD卡)则不会自动删除该目录,及目录下的文件

context.getFilesDir

1
File filesDir = context.getFilesDir();

特点

  • 应用内部存储空间
  • 数据文件私有
  • 不需要申请权限
  • 当应用被卸载的时候,目录下的文件会被删除

当应用被移动到外部存储设备的时候,文件的绝对路径也是变化的,所以建议当数据存储到这个目录的时候,用相对路径
系统提供的访问此路径文件的方法是:

1
2
context.openFileOutput(String,int);
context.openFileInput(String name);

context.getExternalFilesDir

1
File externalFilesDir = context.getExternalFilesDir(null);

特点

  • 应用外部存储空间
  • 数据文件私有
  • 需要申请权限(READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
  • 需要判断外部存储的挂载状态(getExternalStorageState(File)
  • 当应用被卸载的时候,目录下的文件会被删除

当应用被卸载的时候,目录下的文件会被删除,但是这里和getFilesDir()还有不同之处:

只有手机系统使用的是虚拟外部存储(虚拟SD卡)的时候,才可以在卸载应用的同时,自动删除该目录下的文件,如果是之前的物理存储(物理SD卡)则不会自动删除该目录,及目录下的文件

Environment.getExternalStorageDirectory

1
File externalStorageDirectory = Environment.getExternalStorageDirectory();

特点

  • 应用外部存储空间
  • 数据文件非私有
  • 需要申请权限(READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
  • 需要判断外部存储的挂载状态(getExternalStorageState(File)
  • 当应用被卸载的时候,目录下的不会被删除

注:在该目录下读写文件,需要获取读写权限
该目录下的文件,这个目录是用户进行操作的一个根目录,进入二级目录可以通过
getExternalFilesDirs(String), getExternalCacheDirs(), and getExternalMediaDirs()这些方法

官方建议:

不要直接使用该目录,为了避免污染用户的根命名空间
应用私有的数据,应该放在 context.getExternalFilesDir目录下
其他的可以被分享的文件,可以放在Environment.getExternalStoragePublicDirectory(String)目录下

Environment.getExternalStoragePublicDirectory

1
File externalStoragePublicDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

特点

  • 应用外部存储空间
  • 数据文件非私有
  • 需要申请权限(READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
  • 需要判断外部存储的挂载状态(getExternalStorageState(File)
  • 当应用被卸载的时候,目录下的不会被删除

这个目录是用来存放各种类型的文件的目录,在这里用户可以分类管理不同类型的文件(例如音乐、图片、电影等)
类型如下:

  • DIRECTORY_MUSIC
  • DIRECTORY_PODCASTS
  • DIRECTORY_RINGTONES
  • DIRECTORY_ALARMS
  • DIRECTORY_NOTIFICATIONS
  • DIRECTORY_PICTURES
  • DIRECTORY_MOVIES
  • DIRECTORY_DOWNLOADS
  • DIRECTORY_DCIM
  • DIRECTORY_DOCUMENTS