標籤:android
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目錄,只掛載為唯讀
最後所有目錄的代碼返回結果測試如下
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.NoSuchMethodErrorL.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());}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.dbE/com.android.framework﹕ getCacheDir():/data/data/com.android.framework/cacheE/com.android.framework﹕ getFilesDir():/data/data/com.android.framework/filesE/com.android.framework﹕ getDir("zhao"):/data/data/com.android.framework/app_zhaoE/com.android.framework﹕ getPackageCodePath():/data/app/com.android.framework-1.apkE/com.android.framework﹕ getPackageResourcePath():/data/app/com.android.framework-1.apkE/com.android.framework﹕ getExternalFilesDir():/storage/emulated/0/Android/data/com.android.framework/filesE/com.android.framework﹕ getExternalFilesDirs():---/storage/emulated/0/Android/data/com.android.framework/filesE/com.android.framework﹕ getExternalCacheDir():/storage/emulated/0/Android/data/com.android.framework/cacheE/com.android.framework﹕ getExternalCacheDirs():---/storage/emulated/0/Android/data/com.android.framework/cacheE/com.android.framework﹕ getObbDirs():---/storage/emulated/0/Android/obb/com.android.frameworkE/com.android.framework﹕ Environment.getExternalStorageState():mountedE/com.android.framework﹕ Environment.getExternalStorageDirectory():/storage/emulated/0E/com.android.framework﹕ Environment.getDownloadCacheDirectory():/cacheE/com.android.framework﹕ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC):/storage/emulated/0/MusicE/com.android.framework﹕ Environment.getRootDirectory():/system
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
android應用相關目錄的存取方式與函數解析---全