只要是需要進行聯網獲取數據的APP,都會在本地產生緩存文件。那么,這些緩存文件到底放在什地方合適呢?系統有沒有給我們提供建議的緩存位置呢?不同的緩存位置有什么不同呢?
考慮到卸載APP必須刪除緩存
在Android手機里面,緩存的位置分為兩類,一類是Internal Storage,另外一類是External Storage,
Internal Storage(內部存儲)
你的app的internal storage 目錄是以你的app的包名作為標識存放在Android文件系統的特定目錄下[data/data/com.example.xx]
若是你沒有設置為可讀或者可寫,其他app是沒有辦法讀寫的。因此只要你使用MODE_PRIVATE ,那么這些文件就不可能被其他app所訪問
內部存儲在你的APP卸載的時候,會一塊被刪除
我們可以在cache目錄里面放置我們的圖片緩存,而且cache與files的差別在於,如果手機的內部存儲控件不夠了,會自行選擇cache目錄進行刪除,因此,不要把重 要的文件放在cache文件里面
- 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();
- }
運行結果
- 02-03 07:18:04.068 22237-22237/? D/TAG﹕ file1=/data/data/com.socks.baidudemo/files/getFilesDir.txt
- File file2 = new File(getCacheDir(), "cache.txt");
- Log.d("TAG", "file2=" + file2.getAbsolutePath());
- try {
- OutputStream outputStream1 = new FileOutputStream(file2);
- outputStream1.write("cache".getBytes());
- outputStream1.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
運行結果
02-03 07:19:31.508 23652-23652/? D/TAG﹕ file2=/data/data/com.socks.baidudemo/cache/cache.txt
以下是運行后的效果
Internal Storage(外部存儲)
並不總是可用的,因為用戶可以選擇把這部分作為USB存儲模式,這樣就不可以訪問了。
是大家都可以訪問的,因此保存到這里的文件是失去訪問控制權限的。
當用戶卸載你的app時,系統僅僅會刪除external根目錄(getExternalFilesDir())下的相關文件。
External是在你不需要嚴格的訪問權限並且你希望這些文件能夠被其他app所共享或者是允許用戶通過電腦訪問時的最佳存儲區域。
1.首先要檢查狀態
- /* Checks if external storage is available for read and write */
- public boolean isExternalStorageWritable() {
- String state = Environment.getExternalStorageState();
- if (Environment.MEDIA_MOUNTED.equals(state)) {
- return true;
- }
- return false;
- }
- /* Checks if external storage is available to at least read */
- public boolean isExternalStorageReadable() {
- String state = Environment.getExternalStorageState();
- if (Environment.MEDIA_MOUNTED.equals(state) ||
- Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
- return true;
- }
- return false;
- }
2.外部私有存儲
- File file3 = new File(getExternalCacheDir().getAbsolutePath(), "getExternalCacheDir.txt");
- try {
- OutputStream outputStream1 = new FileOutputStream(file3);
- outputStream1.write("getExternalCacheDir".getBytes());
- outputStream1.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- Log.d("TAG", "file3=" + file3);
- File file4 = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "getExternalFilesDir.txt");
- try {
- OutputStream outputStream1 = new FileOutputStream(file4);
- outputStream1.write("getExternalFilesDir".getBytes());
- outputStream1.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
效果圖
3外部公共存儲
APP產生的文件不需要隱藏,即對用戶是可見的,那么你可以把文件放在外部的公共存儲文件下面
- Environment.getExternalStorageDirectory()
- Environment.getExternalStoragePublicDirectory()