默认情况下,保存到内部存储的文件是应用的私有文件,其他应用(和用户)不能访问这些文件。 当用户卸载您的应用时,这些文件也会被移除。
写入到内部存储
写入到\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。如下图:
由于internal_file.txt
文件pull不出来,我们可以使用adb shell cat
命令查看文件内容,如下图:
通过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.txt
的权限如图:
MODE_PRIVATE
将会创建文件(或替换具有相同名称的文件),并将其设为应用的私有文件,默认模式。
MODE_WORLD_READABLE
和 MODE_WORLD_WRITEABLE
从 Android N 开始,使用这些常量将会导致引发 SecurityException。这意味着,面向 Android N 和更高版本的应用无法按名称共享私有文件,尝试共享“file://”URI 将会导致引发FileUriExposedException。 如果您的应用需要与其他应用共享私有文件,则可以将 FileProvider与 FLAG_GRANT_READ_URI_PERMISSION 配合使用。
MODE_APPEND
如果文件已存在,然后将数据写入现有文件的末尾
写入到\data\data\your package\cache
目录
通过ContextWrapper.getCacheDir()
与写入到files目录类似:
cache和files文件的区别
- 当设备的内部存储空间不足或用户卸载您的应用时,Android 可能会删除缓存文件以回收空间。
- 应该始终自行维护缓存文件,使其占用的空间保持在合理的限制范围内(例如 1 MB)
- 点击CLEAR DATA会清除
data\data\your package
目录下的所有目录以及文件;点击CLEAR CACHE会清除data\data\your package\cache
目录下的文件