Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android應用相關目錄的存取方式與函數解析---全

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不可用時,這兩個目錄都是無效的,同樣和應用周期相關的文件,會隨著應用的卸載一起刪除掉

注意需要權限

(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.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()); } 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﹕ 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﹕ getObbDirs():---/storage/emulated/0/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


      
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved