Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Google提供給Android Developer的緩存策略

Google提供給Android Developer的緩存策略

編輯:關於Android編程

注:Android野生Coder一名,文章來源:https://developer.android.com/training/basics/data-storage/files.html

一、數據的存儲

所有 Android 設備都有兩個文件存儲區域:“內部”和“外部”存儲。這些名稱在 Android 早期產生,當時大多數設備都提供內置的非易失性內存(內部存儲),以及移動存儲介質,比如微型 SD 卡(外部存儲)。一些設備將永久性存儲空間劃分為“內部”和“外部”分區,即便沒有移動存儲介質,也始終有兩個存儲空間,並且無論外部存儲設備是否可移動,API 的行為均一致。以下列表匯總了關於各個存儲空間的實際信息。

(一)內部存儲:

它始終可用。
只有您的應用可以訪問此處保存的文件。
當用戶卸載您的應用時,系統會從內部存儲中移除您的應用的所有文件。
當您希望確保用戶或其他應用均無法訪問您的文件時,內部存儲是最佳選擇 getCacheDir()方法用於獲取/data/data//cache目錄 getFilesDir()方法用於獲取/data/data//files目錄 A:先看files目錄 a.

  1. String FILE_NAME = "temp.log";
  2. String data = "Hello World !";
  3. try {
  4. FileOutputStream outputStream = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
  5. outputStream.write(data.getBytes());
  6. outputStream.close();
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }
b.該目錄下多出來我們定義的temp.log文件         最後把文件拉出來確定下數據就是我們寫入的“Hello World” 。 B:再看cache目錄 a:定義方法

  1. //以下方法從URL提取文件名並在您的應用的內部緩存目錄中以該名稱創建文件:
  2. public File getTempFile(Context context, String url) {
  3. File file = null;
  4. try {
  5. String fileName = Uri.parse(url).getLastPathSegment();
  6. file = File.createTempFile(fileName, null, context.getCacheDir());
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }
  10. return file;
  11. }
b.相同操作,更換一下路徑

  1. String FILE_NAME = "temp.log";
  2. String data = "Hello World !";
  3. try {
  4. // FileOutputStream outputStream = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
  5. FileOutputStream outputStream = new FileOutputStream(getTempFile(this, getCacheDir().getAbsolutePath()));
  6. outputStream.write(data.getBytes());
  7. outputStream.close();
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. }
c.然後看結果     看到cache目錄下多出來一個cache2093102610.tmp文件,這就是系統提供的一種存儲命名方式了。牽出來vi下:結果一樣的。(打開方式要選擇)   (二)外部存儲:
  • 它並非始終可用,因為用戶可采用 USB 存儲設備的形式裝載外部存儲,並在某些情況下會從設備中將其移除。
  • 它是全局可讀的,因此此處保存的文件可能不受您控制地被讀取。
  • 當用戶卸載您的應用時,只有在您通過getExternalFilesDir()將您的應用的文件保存在目錄中時,系統才會從此處移除您的應用的文件。 對於無需訪問限制以及您希望與其他應用共享或允許用戶使用計算機訪問的文件,外部存儲是最佳位置。
      提示:盡管應用默認安裝在內部存儲中,但您可在您的清單文件中指定android:installLocation屬性,這樣您的應用便可安裝在在外部存儲中。當 APK 非常大且它們的外部存儲空間大於內部存儲時,用戶更青睐這個選擇。
  可以看到installLocation有三個選項。基本見名知義,詳情請考https://developer.android.com/guide/topics/data/install-location.html 由於外部存儲可能不可用—比如,當用戶已將存儲掛載到電腦或已移除提供外部存儲的 SD 卡時—因此,在訪問它之前,您應始終確認其容量。 您可以通過調用getExternalStorageState()查詢外部存儲狀態。 如果返回的狀態為MEDIA_MOUNTED,那麼您可以對您的文件進行讀寫。 例如,以下方法對於確定存儲可用性非常有用:

  1. /* Checks if external storage is available for read and write */
  2. public boolean isExternalStorageWritable() {
  3. String state = Environment.getExternalStorageState();
  4. if (Environment.MEDIA_MOUNTED.equals(state)) {
  5. return true;
  6. }
  7. return false;
  8. }
  9.  
  10. /* Checks if external storage is available to at least read */
  11. public boolean isExternalStorageReadable() {
  12. String state = Environment.getExternalStorageState();
  13. if (Environment.MEDIA_MOUNTED.equals(state) ||
  14. Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
  15. return true;
  16. }
  17. return false;
  18. }
盡管外部存儲可被用戶和其他應用進行修改,但您可在此處保存兩類文件 公共文件
應供其他應用和用戶自由使用的文件。 當用戶卸載您的應用時,用戶應仍可以使用這些文件。

例如,您的應用拍攝的照片或其他已下載的文件。

私有文件
屬於您的應用且在用戶卸載您的應用時應予刪除的文件。 盡管這些文件在技術上可被用戶和其他應用訪問(因為它們存儲在外部存儲中), 但它們實際上不向您的應用之外的用戶提供任何輸出值。 當用戶卸載您的應用時,系統會刪除應用外部私有目錄中的所有文件。

例如,您的應用下載的其他資源或臨時介質文件。

如果您要將公共文件保存在外部存儲設備上,請使用getExternalStoragePublicDirectory()方法獲取表示外部存儲設備上相應目錄的File。 該方法使用指定您想要保存以便它們可以與其他公共文件在邏輯上組織在一起的文件類型的參數,比如DIRECTORY_MUSIC或DIRECTORY_PICTURES。例如:

  1. public File getAlbumStorageDir(String albumName) {
  2. // Get the directory for the user\'s public pictures directory.
  3. File file = new File(Environment.getExternalStoragePublicDirectory(
  4. Environment.DIRECTORY_PICTURES), albumName);
  5. if (!file.mkdirs()) {
  6. Log.e(LOG_TAG, "Directory not created");
  7. }
  8. return file;
  9. }
如果您要保存您的應用專用文件,您可以通過調用getExternalFilesDir()並向其傳遞指示您想要的目錄類型的名稱,從而獲取相應的目錄。通過這種方法創建的各個目錄將添加至封裝您的應用的所有外部存儲文件的父目錄,當用戶卸載您的應用時,系統會刪除這些文件。例如,您可以使用以下方法來創建個人相冊的目錄:

  1. public File getAlbumStorageDir(Context context, String albumName) {
  2. // Get the directory for the app\'s private pictures directory.
  3. File file = new File(context.getExternalFilesDir(
  4. Environment.DIRECTORY_PICTURES), albumName);
  5. if (!file.mkdirs()) {
  6. Log.e(LOG_TAG, "Directory not created");
  7. }
  8. return file;
  9. }

如果沒有適合您文件的預定義子目錄名稱,您可以改為調用getExternalFilesDir()並傳遞null。這將返回外部存儲上您的應用的專用目錄的根目錄。

切記,getExternalFilesDir()在用戶卸載您的應用時刪除的目錄內創建目錄。如果您正保存的文件應在用戶卸載您的應用後仍然可用—比如,當您的應用是照相機並且用戶要保留照片時—您應改用getExternalStoragePublicDirectory()。

無論您對於共享的文件使用getExternalStoragePublicDirectory()還是對您的應用專用文件使用getExternalFilesDir(),您使用諸如DIRECTORY_PICTURES的 API 常數提供的目錄名稱非常重要。這些目錄名稱可確保系統正確處理文件。 例如,保存在DIRECTORY_RINGTONES中的文件由系統媒體掃描程序歸類為鈴聲,而不是音樂。

二、可用空間 如果您事先知道您將保存的數據量,您可以查出是否有足夠的可用空間,而無需調用getFreeSpace()或getTotalSpace()引起IOException。這些方法分別提供目前的可用空間和存儲卷中的總空間。 此信息也可用來避免填充存儲卷以致超出特定阈值。

但是,系統並不保證您可以寫入與getFreeSpace()指示的一樣多的字節。如果返回的數字比您要保存的數據大小大出幾 MB,或如果文件系統所占空間不到 90%,則可安全繼續操作。否則,您可能不應寫入存儲。

注:保存您的文件之前,您無需檢查可用空間量。 您可以嘗試立刻寫入文件,然後在IOException出現時將其捕獲。 如果您不知道所需的確切空間量,您可能需要這樣做。 例如,如果在保存文件之前通過將 PNG 圖像轉換成 JPEG 更改了文件的編碼,您事先將不知道文件的大小。

三、刪除文件

您應始終刪除不再需要的文件。刪除文件最直接的方法是讓打開的文件參考自行調用delete()。

myFile.delete();

如果文件保存在內部存儲中,您還可以請求Context通過調用deleteFile()來定位和刪除文件:

myContext.deleteFile(fileName);

:當用戶卸載您的應用時,Android 系統會刪除以下各項:

  • 您保存在內部存儲中的所有文件
  • 您使用getExternalFilesDir()保存在外部存儲中的所有文件。

但是,您應手動刪除使用getCacheDir()定期創建的所有緩存文件並且定期刪除不再需要的其他文件。


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