Android内部存储

默认情况下,保存到内部存储的文件是应用的私有文件,其他应用(和用户)不能访问这些文件。 当用户卸载您的应用时,这些文件也会被移除。

写入到内部存储

写入到\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 MonitorDDMSFile 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目录下的文件
    Android内部存储_第1张图片
    setting_apps.png

你可能感兴趣的:(Android内部存储)