android快取路徑(轉載)
在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
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
相關文章
- WebView自定義快取路徑WebView快取
- 轉載快取快取
- Xcode外掛路徑、快取路徑、圖片壓縮工具路徑、程式碼片段路徑、symbolicatecrash路徑XCode快取Symbol
- android監聽SD卡掛載並獲取路徑AndroidSD卡
- win10下edge快取路徑在哪_win10下edge快取路徑怎麼開啟Win10快取
- Java工程路徑及相對路徑(轉載)Java
- VMware複製檔案產生的快取路徑快取
- 獲取檔案路徑(Delphi )----轉貼
- java中獲取類載入路徑和專案根路徑的5種方法Java
- 查詢系統主要檔案路徑 如IE快取等快取
- 取系統路徑
- Retrofit和OkHttp實現 Android網路快取HTTPAndroid快取
- android 路徑大全Android
- android ListView非同步載入圖片(雙快取)AndroidView非同步快取
- win10系統如何更改系統快取檔案路徑Win10快取
- 【轉載】Linux查詢檔案安裝路徑Linux
- Oracle直接路徑載入Oracle
- 預載入與快取快取
- PHP取url絕對路徑PHP
- 【usb儲存掛載】android6.0固定usb儲存掛載路徑Android
- struts/Servlet,action轉到jsp後,路徑問題(struts2,jsp路徑,action路徑,action跳轉,相對路徑,絕對路徑)...ServletJS
- 微信小程式根據本地快取圖片路徑,生成縮圖的方法微信小程式快取
- Android 圖片載入快取問題:為什麼你的Glide快取沒有起作用?Android快取IDE
- Qt的相對路徑轉為絕對路徑QT
- Android 從手機相簿獲取圖片 uri 路徑 從相機獲取照片Android
- Android開發:計算快取大小並且清空快取Android快取
- Android使用磁碟快取DiskLruCacheAndroid快取
- android快取資料到本地Android快取
- Android DiskLruCache快取完全解析Android快取
- 【轉載】分散式快取能否作為NoSQL資料庫?分散式快取SQL資料庫
- Mybatis延遲載入、快取MyBatis快取
- Swift - Alamofire與Cache封裝實現網路快取、下載Swift封裝快取
- PHP 常用獲取路徑程式碼PHP
- svg獲取路徑的長度SVG
- Java獲取WEB目錄路徑JavaWeb
- js獲取專案根路徑JS
- c#獲取路徑 c/sC#
- 深入理解Android中的快取機制(三)磁碟快取Android快取