这篇来介绍和 File 有关的东西。
凡是从网络下载来的东西都可以以文件的形式保存,
所以了解 Android 的文件系统也是很重要的。
外部存储和内部存储
任何一台智能手机都将存储空间分为两部分,外部存储和内部存储。
对于有 SD 卡的手机来说,可移除的 SD 卡就是它的外部存储,剩余的是内部。
尽管越来越多的手机不再配有 SD 卡,但存储空间依旧分为了两部分。
内部存储是永远是 avaiable 的,而外部则不一定。
所以,需要检测下外部存储是否可用,再拟定存储策略。
APP 被安装在哪?
/data/data/com.example.myapp/files
/data/data/com.example.myapp/cache
APP 默认情况下是安装在内部存储中的,路径如上所示。
com.example.myapp/ 目录下的文件,默认情况下只有该 APP 才有访问的权限。
而且该目录下的文件会在卸载 APP 时被清除。
可以看到有两个目录,普通文件目录和缓存文件目录。
区别是缓存目录下的文件可能随时被系统删除。
外部存储
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
这个函数用于判断外部存储是否可读写。
外部存储分为两类文件,共有和私有文件。
先看下私有文件。
Log.e("result2", getExternalFilesDir(null).toString());
Log.e("result2", getExternalCacheDir().toString());
/storage/emulated/0/Android/data/com.example.myapp/files
/storage/emulated/0/Android/data/com.example.myapp/cache
1. 同样是分成了两个目录。
2. 卸载时会清除这些文件。
不同点:
1. 没有访问权限限制。
2. 普通文件有了种类的区分,像是音乐或图片。
这样一来,系统能更好地根据类型来处理这些文件。
公有文件也是类似的,但不会再卸载时被清除。
Log.e("result2", getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString());
Log.e("result2", getExternalFilesDir(Environment.DIRECTORY_PICTURES).toString());
/storage/emulated/0/Android/data/com.example.myapp/files/Music
/storage/emulated/0/Android/data/com.example.myapp/files/Photo
公有文件也是类似的,但不会再卸载时被清除。
Log.e("result2", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).toString());
Log.e("result2", Environment.getExternalStorageDirectory().toString());
/storage/emulated/0/Music
/storage/emulated/0