1. 程式人生 > >Android儲存及getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()區別

Android儲存及getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()區別

儲存介紹

Android系統分為內部儲存和外部儲存,內部儲存是手機系統自帶的儲存,一般空間都比較小,外部儲存一般是SD卡的儲存,空間一般都比較大,但不一定可用或者剩餘空間可能不足。一般我們儲存內容都會放在外部儲存空間裡。使用過程注意事項:

  1. 先判斷SD卡是否可用,可用時優先使用SD卡的儲存,不可用時用內部儲存
  2. 儲存在SD卡上時,可以在SD卡上新建任意一個目錄存放,也可以存放在應用程式內部資料夾,區別是在SD卡的任意目錄存放時內容不會隨應用程式的解除安裝而消失,而在應用程式內部的內容會隨應用程式解除安裝消失。
  3. 一般快取檔案放在應用程式內部,使用者主動儲存的檔案放在SD卡上的資料夾裡。如果在SD卡上任意新建目錄存放所有資料,使用者解除安裝時會殘存大量檔案,招致使用者反感。

儲存路徑

一般我們可以通過 Context 和 Environment 相關的方法獲取檔案存取的路徑。

1.內部儲存

1.1 根目錄($rootDir)/data,通過 Environment.getDataDirectory() 獲取。
1.2 應用程式目錄($applicationDir)$rootDir/data/包名(不一定,不同裝置可能不同)
應用快取目錄$applicationDir/cache,通過Context.getCacheDir()獲取。
應用檔案目錄$applicationDir/files,通過Context.getFilesDir()

獲取。Context.getFileStreamPath(String name)返回以name為檔名的子檔案目錄,若name為空,則返回檔案根目錄。假設我們的應用程式包名為com.learn.test,路徑如下:

Environment.getDataDirectory():      /data
Context.getCacheDir():               /data/data/com.learn.test/cache
Context.getFilesDir():               /data/data/com.learn.test/files
Context.getFileStreamPath
(""): /data/data/com.learn.test/files Context.getFileStreamPath("test"): /data/data/com.learn.test/files/test


2.外部儲存

2.1 根目錄($rootDir)/storage/emulated/0(不一定,不同裝置可能不同),通過 Environment.getExternalStorageDirectory() 獲取。
2.2 應用程式目錄($applicationDir)$rootDir/Andorid/data/包名
應用快取目錄$applicationDir/cache,通過Context.getExternalCacheDir()獲取。
應用檔案目錄$applicationDir/files,通過Context.getExternalFilesDir(String type),type為空字串時獲取。type系統給我們提供了很多常用的型別,比如圖片和下載等等:

public static String DIRECTORY_MUSIC = "Music";
public static String DIRECTORY_ALARMS = "Alarms";
public static String DIRECTORY_NOTIFICATIONS = "Notifications";
public static String DIRECTORY_PICTURES = "Pictures";
public static String DIRECTORY_MOVIES = "Movies";
public static String DIRECTORY_DOWNLOADS = "Download";
public static String DIRECTORY_DCIM = "DCIM";
public static String DIRECTORY_DOCUMENTS = "Documents";

假設我們的應用程式包名為com.learn.test,路徑如下:

Environment.getExternalStorageDirectory():               /storage/emulated/0
Context.getExternalCacheDir():                           /storage/emulated/0/Android/data/com.learn.test/cache
Context.getExternalFilesDir(""):                         /storage/emulated/0/Android/data/com.learn.test/files
Context.getExternalFilesDir("test"):                     /storage/emulated/0/Android/data/com.learn.test/files/test
Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES):    /storage/emulated/0/Android/data/com.learn.test/files/Pictures

2.3 公共儲存目錄: 我們可以在外部儲存上新建任意資料夾,不過在6.0及之後的系統需要動態申請許可權,這些目錄的內容不會隨著應用的解除安裝而消失。如:

Environment.getExternalStorageDirectory():                     /storage/emulated/0
Environment.getExternalStoragePublicDirectory(""):             /storage/emulated/0
Environment.getExternalStoragePublicDirectory("test"):         /storage/emulated/0/test
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES):  /storage/emulated/0/Pictures

參考

Android 儲存使用參考