android的存储路径

Android的储存

  • 内部储存
1
2
3
4
5
6
context.getFilesDir();
//创建/data/user/0/com.example.androidbase/files文件夹,随着应用位置的改变,位置可能改变
context.getCacheDir();
//创建/data/user/0/com.example.androidbase/cache文件夹当需要空间时,系统会自动删除其中的文件(先删除存在最长时间的)
Environment.getDataDirectory()
//使用Environment来获取

注意:读写上述的方法返回的文件对象是,不用申请权限,当用户卸载app时,系统会删除data目录下所有关于该app的文件

  • 外部储存的私有目录
1
2
3
4
context.getExternalCacheDir()://一般存放临时缓存数据,对应 清除缓存
context.getExternalFilesDir(String type)://一般放一些长时间保存的数据,对应 清除数据
//使用Environment来获取,需要获取权限来操作
Environment.getExternalStorageDirectory();

与上述的对应方法的不同点

  • 系统一般不会清理在里面的文件
  • 用户可能操作在里面的文件,使用时应该加个非空判断
  • 获取WRITE_EXTERNAL_STORAGE的其他应用可以操作该文件

注意: 随应用卸载后删除

  • type的取值
    type:(可以为null,为null时: /storage/emulated/0/Android/data/com.example.androidbase/files)
1
2
3
4
5
6
7
DIRECTORY_MUSIC, 为DIRECTORY_MUSIC时:/storage/emulated/0/Android/data/com.example.androidbase/files/Music
DIRECTORY_PODCASTS,
DIRECTORY_RINGTONES,
DIRECTORY_ALARMS,
DIRECTORY_NOTIFICATIONS,
DIRECTORY_PICTURES,
DIRECTORY_MOVIES.
  • 外部储存的公共目录
1
2
3
4
5
6
7
/**
* 需要申请权限
* Type的值看上面(不能为null),注意要创建文件时不能使用 File的 mkdir() 和 mkdirs() 方法,它们只会创建目录,可以使用
*createNewFile()或者不使用 都可以创建文件
*
*/
Environment.getExternalStoragePublicDirectory(String type);
  • 因为外部存储可能是不可用的,比如遇到SD卡被拔出等情况时。因此在访问之前应对其可用性进行检查。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*检查外部存储是否可以读写*/
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}

/* 检查外部存储是否可读 */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
  • 查询剩余空间

如果事先知道想要保存的文件大小,可以通过执行getFreeSpace() or getTotalSpace() 来判断是否有足够的空间来保存文件,从而避免发生IOException。那些方法提供了当前可用的空间还有存储系统的总容量。然而,系统并不能保证可以写入通过getFreeSpace()查询到的容量文件, 如果查询的剩余容量比我们的文件大小多几MB,或者说文件系统使用率还不足90%,这样则可以继续进行写的操作,否则最好不要写进去。

并没有强制要求在写文件之前去检查剩余容量。我们可以尝试先做写的动作,然后通过捕获 IOException 。这种做法仅适合于事先并不知道想要写的文件的确切大小。例如,如果在把PNG图片转换成JPEG之前,我们并不知道最终生成的图片大小是多少。

  • 手动删除文件

在不需要使用某些文件的时候应删除它。删除文件最直接的方法是直接执行文件的delete()方法。

myFile.delete();

如果文件是保存在internal storage,我们可以通过Context来访问并通过执行deleteFile()进行删除

Context.deleteFile(fileName);

更详细的可以参考: