Android 开发中基本都要使用到文件的保存和读取操作,我们一般遇见的文件读写问题有几个:文件保存在哪?以及如何使用相关函数,目录权限的问题?以及删除应用之后目录是否会随之删除的问题?接下来就来解析一下这几个相关目录的操作函数。
转载请注明出处:http://blog.csdn.net/self_study/article/details/58587412
对技术感兴趣的同鞋加群 544645972 一起交流。
我们这里假设应用的名字叫做 com.android.framework:
对应的目录名字为 /data/data/com.android.framework/。
该目录是只对应用可见的,而且如果手机没有 root,用普通权限的 adb 也看不了这个目录,该目录用来存储和应用周期相关的文件,会随着应用的卸载一起删除,相关的子目录如下所示:
SD 卡下的目录,顾名思义就是需要插入 SD 卡,当 SD 卡不可用时这两个目录都是无效的,SD 卡下面也分为应用的私有目录和共有目录,私有目录的生命周期也是和应用挂钩的,卸载之后就会被删除,共有目录不会随着应用的卸载而删除。
可以通过 Environment.getExternalStorageState() 函数来获取 SD 卡的挂载状态,当该函数返回 mounted 的时候,代表 SD 卡可用。
注意 SD 卡使用时需要注册相关权限:
该目录下的文件卸载应用之后会自动删除。
对应为 /sdcard/Android/data/com.android.framework/。
对应为 /sdcard/Android/obb/com.android.framework/。
需要注意的是,obb 目录也可能不存在,原文:Note if the application does not have any OBB files, this directory may not exist,一般游戏 APP 会将游戏相关的数据包放到这个目录下。
该目录的的相关函数简单只有两个:getObbDirs() 和 getObbDir(),前者调用之后会自动生成该目录,后者在插入外置存储卡之后会在前者的基础上另外返回外置存储卡的 obb 目录,具体的结果可以查看后面的源码和结果。
该目录下的文件卸载应用之后还会留存,所以为了 SD 卡的整洁度,不要随便在 SD 卡的根目录下面创建文件,最好以应用名字创建一个目录,所有的需要卸载之后留存或者需要给其他应用共享的文件都放到该目录下,不要在根目录下创建文件,还有一个公司的多个应用最好共享一个目录,特别讨厌 360 ,恨不得把 360XXX 式的目录全部创建完才行,极其讨厌和反对。
对应为 /sdcard/XXX。
注意:手机如果还能够SD卡扩展,就相当于能挂载两张SD卡,下面的测试结果也是两张SD卡的结果:
L.e("getDatabasePath():"+getDatabasePath("student.db"));
L.e("getCacheDir():" + getCacheDir());
L.e("getFilesDir():" + getFilesDir());
String[] strings = fileList();
for (String path : strings){//为空
L.e("fileList():---" + path);
}
L.e("getDir(\"zhao\"):" + getDir("zhao", MODE_PRIVATE));
// L.e("getCodeCacheDir():" + getCodeCacheDir()); //java.lang.NoSuchMethodError
L.e("getPackageCodePath():" + getPackageCodePath());
L.e("getPackageResourcePath():" + getPackageResourcePath());
L.e("getExternalFilesDir():" + getExternalFilesDir(null));
File[] paths = getExternalFilesDirs(null);
for (File path : paths){
L.e("getExternalFilesDirs():---" + path.getPath());
}
L.e("getExternalCacheDir():" + getExternalCacheDir());
paths = getExternalCacheDirs();
for (File path : paths){
L.e("getExternalCacheDirs():---" + path.getPath());
}
L.e("getObbDir():" + getObbDir());
paths = getObbDirs();
for (File path : paths){
L.e("getObbDirs():---" + path.getPath());
}
L.e("Environment.getExternalStorageState():"+ Environment.getExternalStorageState());
L.e("Environment.getExternalStorageDirectory():"+Environment.getExternalStorageDirectory());
L.e("Environment.getDownloadCacheDirectory():"+Environment.getDownloadCacheDirectory());
L.e("Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC):"+Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC));
L.e("Environment.getRootDirectory():"+Environment.getRootDirectory());
对应的结果为,注意看外部存储卡的路径:
E/com.android.framework﹕ getDatabasePath():/data/data/com.android.framework/databases/student.db
E/com.android.framework﹕ getCacheDir():/data/data/com.android.framework/cache
E/com.android.framework﹕ getFilesDir():/data/data/com.android.framework/files
E/com.android.framework﹕ getDir("zhao"):/data/data/com.android.framework/app_zhao
E/com.android.framework﹕ getPackageCodePath():/data/app/com.android.framework-1.apk
E/com.android.framework﹕ getPackageResourcePath():/data/app/com.android.framework-1.apk
E/com.android.framework﹕ getExternalFilesDir():/storage/emulated/0/Android/data/com.android.framework/files
E/com.android.framework﹕ getExternalFilesDirs():---/storage/emulated/0/Android/data/com.android.framework/files
E/com.android.framework﹕ getExternalFilesDirs():---/storage/ext_sd/Android/data/com.android.framework/files*******
E/com.android.framework﹕ getExternalCacheDir():/storage/emulated/0/Android/data/com.android.framework/cache
E/com.android.framework﹕ getExternalCacheDirs():---/storage/emulated/0/Android/data/com.android.framework/cache
E/com.android.framework﹕ getExternalCacheDirs():---/storage/ext_sd/Android/data/com.android.framework/cache*******
E/com.android.framework﹕ getObbDir():/storage/emulated/0/Android/obb/com.android.framework
E/com.android.framework﹕ getObbDirs():---/storage/emulated/0/Android/obb/com.android.framework
E/com.android.framework﹕ getObbDirs():---/storage/ext_sd/Android/obb/com.android.framework*******
E/com.android.framework﹕ Environment.getExternalStorageState():mounted
E/com.android.framework﹕ Environment.getExternalStorageDirectory():/storage/emulated/0
E/com.android.framework﹕ Environment.getDownloadCacheDirectory():/cache
E/com.android.framework﹕ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC):/storage/emulated/0/Music
E/com.android.framework﹕ Environment.getRootDirectory():/system