APP的快取檔案到底應該存在哪?
只要是需要進行聯網獲取資料的APP,那麼不管是版本更新,還是圖片快取,都會在本地產生快取檔案。那麼,這些快取檔案到底放在什地方合適呢?系統有沒有給我們提供建議的快取位置呢?不同的快取位置有什麼不同呢?今天這篇文章就是主要來說明這個問題的。
首先,我們要知道,在Android手機裡面,快取的位置分為兩類,一類是Internal Storage,即內部儲存,另外一類是External Storage,即外部儲存。比較老的手機,有一個手機內部儲存,還有一個SD卡儲存,就是分別對應這兩種儲存位置,因為以前的SD卡是可以擴充套件的,即可拆卸的,所以可以用是否可拆卸作為內外儲存的分類標準。但是現在最新的裝置,比如小米、錘子、華為等,都取消了可拆卸的SD卡,直接與機身焊接在一起,分為16G、32G版本,所以現在內外儲存的分類不再以是否可拆卸作為標準,而是以下面的幾方面作為新的標準:
內部儲存:
總是可用的
這裡的檔案預設是只能被你的app所訪問的。
當用戶解除安裝你的app的時候,系統會把internal裡面的相關檔案都清除乾淨。
Internal是在你想確保不被使用者與其他app所訪問的最佳儲存區域。
外部儲存:
並不總是可用的,因為使用者可以選擇把這部分作為USB儲存模式,這樣就不可以訪問了。
是大家都可以訪問的,因此儲存到這裡的檔案是失去訪問控制權限的。
當用戶解除安裝你的app時,系統僅僅會刪除external根目錄(getExternalFilesDir())下的相關檔案。
External是在你不需要嚴格的訪問許可權並且你希望這些檔案能夠被其他app所共享或者是允許使用者通過電腦訪問時的最佳儲存區域。
讀取內部儲存不需要許可權,但是讀取或者是寫入外部儲存需要許可權,在現版本里面,讀許可權不進行宣告,也可以實現讀取,但是在以後版本可能會修改,所以請務必加上,如果應用需要寫入許可權,那麼只宣告寫入許可權即可,不需要再宣告讀取許可權。
下面分別說明如何獲取內外儲存的檔案位置和區別。
一.儲存到內部儲存的方式
1.getFileDir() 通過此方法可以獲取到你的APP內部儲存的檔案,路徑為/data/data/pacgage_name/files
我們直接上程式碼進行測試:
1 2 3 4 5 6 7 8 9 10 |
File file1 = new File(getFilesDir(), "getFilesDir.txt" );
Log.d( "TAG" , "file1=" + file1.getAbsolutePath());
try {
OutputStream outputStream1 = new FileOutputStream(file1);
outputStream1.write( "file" .getBytes());
outputStream1.close();
} catch (Exception e) {
e.printStackTrace();
}
|
執行結果如下:
1 |
02-03 07:18:04.068 22237-22237/? D/TAG﹕ file1=/data/data/com.socks.baidudemo/files/getFilesDir.txt
|
2.getCacheDir() 通過此方法可以獲取到你的APP內部儲存的檔案,路徑為/data/data/package_name/cache
測試程式碼:
1 2 3 4 5 6 7 8 9 |
File file2 = new File(getCacheDir(), "cache.txt" );
Log.d( "TAG" , "file2=" + file2.getAbsolutePath());
try {
OutputStream outputStream1 = new FileOutputStream(file2);
outputStream1.write( "cache" .getBytes());
|