默認情況下,保存到內部存儲的文件是應用的私有文件,其他應用(和用戶)不能訪問這些文件。 當用戶卸載您的應用時,這些文件也會被移除。
寫入到內部存儲
寫入到\data\data\your package\files
目錄
通過ContextWrapper.getFilesDir()
String s = "hello internal";
File file = new File(getFilesDir(), "internal_file.txt");
FileOutputStream out = null;
try {
out = new FileOutputStream(file);
out.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out == null)
return;
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
運行上述代碼后,可以通過Tools—>Android—>Android Device Monitor
中DDMS
的File Explorer
查看data\data\your package\files
目錄下是否有internal_file
文件,如果無法打開data
目錄,請查看android device monitor cannot open data folder。如下圖:
storage_file_path.png
由于internal_file.txt
文件pull不出來,我們可以使用adb shell cat
命令查看文件內容,如下圖:
internal_file_content.png
通過ContextWrapper.openFileOutput()
String s = "hello internal";
FileOutputStream out = null;
try {
out = openFileOutput("internal_file.txt", MODE_PRIVATE);
out.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out == null)
return;
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
運行之后得到的結果和第一種方式一樣,區別如下:
- 通過第一種方式得到的
internal_file.txt
的權限如圖:
internal_file_permission1.png
- 而這種方式得到的
internal_file.txt
的權限如圖:
internal_file_permission2.png
MODE_PRIVATE
將會創建文件(或替換具有相同名稱的文件),并將其設為應用的私有文件,默認模式。
internal_file_content.png
MODE_WORLD_READABLE
和 MODE_WORLD_WRITEABLE
從 Android N 開始,使用這些常量將會導致引發 SecurityException。這意味著,面向 Android N 和更高版本的應用無法按名稱共享私有文件,嘗試共享“file://”URI 將會導致引發FileUriExposedException。 如果您的應用需要與其他應用共享私有文件,則可以將 FileProvider與 FLAG_GRANT_READ_URI_PERMISSION 配合使用。
MODE_APPEND
如果文件已存在,然后將數據寫入現有文件的末尾
internal_file_content_append.png
寫入到\data\data\your package\cache
目錄
通過ContextWrapper.getCacheDir()
與寫入到files目錄類似:
internal_cache_path.png
cache和files文件的區別
- 當設備的內部存儲空間不足或用戶卸載您的應用時,Android 可能會刪除緩存文件以回收空間。
- 應該始終自行維護緩存文件,使其占用的空間保持在合理的限制范圍內(例如 1 MB)
- 點擊CLEAR DATA會清除
data\data\your package
目錄下的所有目錄以及文件;點擊CLEAR CACHE會清除data\data\your package\cache
目錄下的文件
setting_apps.png