【Android】存儲與緩存

趙凱強 github原文地址

緩存文件可以放在哪裏?它們各自的特點是什麼?

在Android手機裏面,緩存的位置分爲兩類,一類是Internal Storage,即內部存儲,另外一類是External Storage,即外部存儲。

比較老的手機,有一個手機內部存儲,還有一個SD卡存儲,就是分別對應這兩種存儲位置,因爲以前的SD卡是可以擴展的,即可拆卸的,所以可以用是否可拆卸作爲內外存儲的分類標準。

但是現在最新的設備,比如小米、錘子、華爲等,都取消了可拆卸的SD卡,直接與機身焊接在一起,分爲16G、32G版本,所以現在內外存儲的分類不再以是否可拆卸作爲標準,而是以下面的幾方面作爲新的標準:

內部存儲

  • 總是可用的
  • 這裏的文件默認是隻能被你的app所訪問的。
  • 當用戶卸載你的app的時候,系統會把internal裏面的相關文件都清除乾淨。
  • Internal是在你想確保不被用戶與其他app所訪問的最佳存儲區域。

外部存儲

  • 並不總是可用的,因爲用戶可以選擇把這部分作爲USB存儲模式,這樣就不可以訪問了。
  • 是大家都可以訪問的,因此保存到這裏的文件是失去訪問控制權限的。
  • 當用戶卸載你的app時,系統僅僅會刪除external根目錄(getExternalFilesDir())下的相關文件。
  • External是在你不需要嚴格的訪問權限並且你希望這些文件能夠被其他app所共享或者是允許用戶通過電腦訪問時的最佳存儲區域。

文件位置

內部存儲

  • getFileDir() 通過此方法可以獲取到你的APP內部存儲的文件,路徑爲/data/data/pacgage_name/files
  • getCacheDir() 通過此方法可以獲取到你的APP內部存儲的文件,路徑爲/data/data/package_name/cache
  • openFileOutput() 通過此方法,我們可以獲取到一個輸出流,輸出流的保存路徑是/data/data/package_name/files ,和getFileDir()的路徑一致

外部存儲

私有存儲

  • Context.getExternalCacheDir()
  • Context.getExternalFilesDir()

創建的私有文件的地址是/sdcard/Android/date/package_name下面,Android文件夾是隱藏文件夾,用戶無法操作。

如果我們想緩存圖片等比較耗空間的文件,推薦放在getExternalCacheDir()所在的文件下面,這個文件和getCacheDir()很像,都可以放緩存文件,在APP被卸載的時候,都會被系統刪除,而且緩存的內容對其他APP是相對私有的。

公共存儲

你的APP產生的文件不需要隱藏,即對用戶是可見的,那麼你可以把文件放在外部的公共存儲文件下面。這個方法不是Context的方法,而是Environment的兩個方法,第一個方法獲取到的其實是外部存儲的根目錄,而第二個方法獲取到得則是外部存儲的公共目錄。其實在訪問權限上是沒有區別的,不同點是getExternalStoragePublicDirectory()在運行的時候,會需要你帶有一個特定的參數來指定這些public的文件類型,以便於與其他public文件進行分類。

  • Environment.getExternalStorageDirectory()
  • Environment.getExternalStoragePublicDirectory()

表現

內部存儲

你的app的internal storage 目錄是以你的app的包名作爲標識存放在Android文件系統的特定目錄下[data/data/com.example.xx]。 從技術上講,如果你設置文件爲可讀的,那麼其他app就可以讀取你的internal文件。然而,其他app需要知道你的包名與文件名。若是你沒有設置爲可讀或者可寫,其他app是沒有辦法讀寫的。因此只要你使用MODE_PRIVATE ,那麼這些文件就不可能被其他app所訪問。

另外記住一點,內部存儲在你的APP卸載的時候,會一塊被刪除,因此,我們可以在cache目錄裏面放置我們的圖片緩存,而且cache與files的差別在於,如果手機的內部存儲空間不夠了,會自行選擇cache目錄進行刪除,因此,不要把重要的文件放在cache文件裏面,可以放置在files裏面,因爲這個文件只有在APP被卸載的時候纔會被刪除。還有要注意的一點是,如果應用程序是更新操作,內部存儲不會被刪除,區別於被用戶手動卸載。

外部存儲

不管你是使用 getExternalStoragePublicDirectory() 來存儲可以共享的文件,還是使用 getExternalFilesDir() 來儲存那些對於你的app來說是私有的文件,有一點很重要,那就是你要使用那些類似DIRECTORY_PICTURES 的API的常量。那些目錄類型參數可以確保那些文件被系統正確的對待。例如,那些以DIRECTORY_RINGTONES 類型保存的文件就會被系統的media scanner認爲是ringtone而不是音樂。

清除數據、清除緩存的區別

  • 清除數據主要是清除用戶配置,比如SharedPreferences、數據庫等等,這些數據都是在程序運行過程中保存的用戶配置信息,清除數據後,下次進入程序就和第一次進入程序時一樣
  • 緩存是程序運行時的臨時存儲空間,它可以存放從網絡下載的臨時圖片,從用戶的角度出發清除緩存對用戶並沒有太大的影響,但是清除緩存後用戶再次使用該APP時,由於本地緩存已經被清理,所有的數據需要重新從網絡上獲取。爲了在清除緩存的時候能夠正常清除與應用相關的緩存,請將緩存文件存放在getCacheDir()或者 getExternalCacheDir()路徑下。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章