android快取路徑(轉載)

weixin_34402408發表於2016-09-23

在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()路徑下。

文/跑跑嵐之山(簡書作者)

原文連結:http://www.jianshu.com/p/c181a13a0e87

著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。

相關文章