android应用基本都需要进行文件的保存工作,以前总是需要的时候从网上随便搜搜,但是没有去做一个总结,今天不能在拖了,来做个总结!
很基础的东西,小白一个,真心希望能帮到大家,错误的地方大家指点一下
我遇见的文件读取问题一般有这几个:文件保存在哪?以及如何考虑相关函数,目录权限的问题?以及删除应用之后目录是否会随之删除的问题?
一般存储的路径有三种:
比如应用的名字叫做com.android.framework
1. /data/data/package_name/
该目录是只对应用可见的,而且如果手机没有root,用adb也是看不了这个目录,该目录用来存储和应用周期相关的文件,会随着应用的卸载一起删除掉
/data/data/com.android.framework/shared_prefs/ 用来存储SharedPreference
/data/data/com.android.framework/databases/ 用来存储数据库DB,相关函数还有getDatabasePath()
/data/data/com.android.framework/app_webview 和 /data/data/package_name/xxxwebviewcachexxx 用来存储应用内置webview所产生的cache和cookies等,该目录由于android版本不同名字和位置也可能不同
/data/data/com.android.framework/lib 用来存储该应用的.so静态库文件
/data/data/com.android.framework/cache 该目录可以使用函数getCacheDir()获取
/data/data/com.android.framework/files 该目录可以使用函数getFilesDir()获取,openFileInput()和openFileOutput()函数也是在该目录下操作文件,fileList()函数是用来列出该files目录下的所有文件,deleteFile(String name)用来删除该files目录下的文件
/data/data/com.android.framework/ 这个目录下面当然也能够创建子集的目录,使用的方法就是getDir(String name, int mode),参数中的name就是需要在该目录下创建的子目录名字
你如果能够打开应用的该目录,一般会在该目录下看到很多子目录
注:以上函数没有明确指定的都是使用context调用
PS:
还有一个特别奇怪的函数,无意中看见的getCodeCacheDir()函数,该函数的解释为This location is optimal for storing compiled or optimized code generated by your application at runtime,该目录适合在运行时存放应用产生的编译或者优化的代码,但是我调用就报了NoSuchMethodError,忘赐教~~
还有其他的相关函数
getPackageCodePath() = /data/app/com.android.framework-1.apk
getPackageResourcePath() = /data/app/com.android.framework-1.apk
2. SD卡Android目录下的两个子目录
注:该目录是挂载到SD卡下面的,所以SD不可用时,这两个目录都是无效的,同样和应用周期相关的文件,会随着应用的卸载一起删除掉
注意需要权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(1)Android/data/package_name/
Android/data/com.android.framework/files/ 该目录可用getExternalFilesDir(String type)和getExternalFilesDirs(String type)获取,参数type为子目录名字,null则为根目录,后者调用之后会自动生成该目录
Android/data/com.android.framework/cache/ 该目录可用getExternalCacheDir()和getExternalCacheDirs()获取,后者调用之后自动生成该目录
(2)Android/obb/package_name/ (obb目录也可能不存在),原文:Note if the application does not have any OBB files, this directory may not exist
该目录的的相关函数简单只有两个:getObbDirs()和getObbDir(),前者调用之后会自动生成该目录,该目录一般是游戏的数据包目录
3. SD卡下面自定义的一个文件目录
除了上边两个目录之外,当然还能在SD卡下自定义目录,一般用来永久存储,卸载应用之后不会删除,相关函数如下
Environment.getExternalStorageState(),这个函数用来获取SD卡的挂载状态,如果传入参数path则是获取该路径的的挂载状态,比如这个目录被用户的PC挂载,或者从设备中移除,或者其他问题发生,状态的返回是不一样的Environment.getExternalStorageDirectory(),该函数用来返回SD卡的根目录,即/storage/emulated/0/,注意不要在根目录下创建文件,强烈建立创建一个子目录去操作,要不然会污染SD卡的主目录,函数中还有一段介绍It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions),该目录所有应用都可操作,为共享目录最后所有目录的代码返回结果测试如下Environment.getDownloadCacheDirectory(),该函数用来返回SD卡下面的下载缓存目录
Environment.getDataDirectory(),该函数用来获取用户的数据目录
Environment.getExternalStoragePublicDirectory(String type),该函数用来根据类型返回相关目录,类型为Environment的一些变量,传入的类型参数不能是null,返回的目录路径有可能不存在,所以必须在使用之前确认一下,没有就创建该目录
Environment.getRootDirectory(),该函数用来返回根System目录,只挂载为只读注意:手机如果还能够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