当前位置: 首页 > article >正文

Android——内部/外部存储

Android 内部存储

  • 与宿主 App 的生命周期相同,应用卸载时,会被系统自动删除
  • 宿主 App 可以直接访问,无需权限。
  • 其他应用无权访问。
  • 用户访问需 Root 权限。
  • 适合存储与应用直接相关,隐私性或敏感性高的数据。

主要API

  • getDataDir()

存放目录:/data/data/包名

  • getFilesDir()

存放目录:/data/data/包名/files

  • getDir(String name, int mode)

存放目录:/data/data/包名/指定的name名 (如果该目录不存在,系统会自动创建该目录)

mode

  • MODE_APPEND:即向文件尾写入数据
  • MODE_PRIVATE:即仅打开文件可写入数据
String directory = getFilesDir().toString();
path = directory + File.separator + fileName;

FileUtil.saveText(path, sb.toString());

Android 外部存储

Android把外部存储分为两块区域,一块是所有应用均可访问的公共空间,另一块是只有应用自己才可访问的私有空间

私有空间

  • 与宿主 App 的生命周期相同,应用卸载时,会被系统自动删除
  • 宿主 App 可以直接访问,无需权限。(备注:从 4.4 版本开始,宿主 App 可以直接读写外部存储空间中的应用私有目录, 4.4 版本之前,开发人员需在 Manifest 申请外部存储空间的文件读写权限。)
  • 其他 App 可以访问。(备注:自 Android 7.0 开始,系统对应用私有目录的访问权限进一步限制。其它App无法通过 file:// 这种形式的 Uri 直接读写该目录下的文件内容,需通过 FileProvider 访问。)
  • 用户可直接访问,无需权限
  • 适合存储与应用直接相关,隐私性或敏感性都不高的数据。

主要API

  • getExternalFilesDir()

存放目录:/storage/emulated/0/Android/data/包名/files

  • getExternalCacheDir()

存放目录:/storage/emulated/0/Android/data/包名/cache

String fileName = System.currentTimeMillis() + ".txt";
String directory = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();
path = directory + File.separator + fileName;
FileUtil.saveText(path, sb.toString());

公共空间

  • 与宿主 App 生命周期无关,应用卸载后,数据仍然保留
  • 所有的App都需要申请 EXTERNAL_STORAGE 权限,Android 6.0 开始需申请动态权限。
  • 用户访问,无需权限。
  • 适合存储不敏感的数据,且希望与其他应用共享的数据。

主要API

  • Environment.getExternalStoragePublicDirectory(String type)

存放目录:/storage/emulated/0/指定的type

String directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();

权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

注:
Android 10 开始,在 Manifest 增加了新属性:android:hasFragileUserData=“true”,如果这里的值为“true”,在卸载 App 的时候,在弹出的对话框里可以由用户勾选是否保留数据。如果勾选的话,那么“外部存储 - 应用私有目录”中数据就会保留,而不会被系统清理。但是不管这里是否勾选,内部存储私有目录里的数据都会被系统删除。

FileUtil

public class FileUtil {
    // 把字符串保存到指定路径的文本文件
    public static void saveText(String path, String txt) {
        BufferedWriter os = null;
        try {
            os = new BufferedWriter(new FileWriter(path));
            os.write(txt);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 从指定路径的文本文件中读取内容字符串
    public static String openText(String path) {
        BufferedReader is = null;
        StringBuilder sb = new StringBuilder();
        try {
            is = new BufferedReader(new FileReader(path));
            String line;
            
            while ((line = is.readLine()) != null) {
                sb.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
}

案例代码


http://www.kler.cn/a/319784.html

相关文章:

  • 【WRF理论第十二期】输出文件:wrfout 和 wrfrst
  • 【缺陷检测】Anomaly Detection via Reverse Distillation from One-Class Embedding
  • 【PHP】ThinkPHP基础
  • 亲测有效:Maven3.8.1使用Tomcat8插件启动项目
  • 力扣662:二叉树的最大宽度
  • 成都睿明智科技有限公司解锁抖音电商新玩法
  • HTTP常见状态码 HTTP的逐步发展(通俗易懂版)
  • 利士策分享,赚钱有道,底线思维不可抛
  • 网络安全-shire写任务计划、反弹shell、写私钥、反序列化
  • 机器学习算法与Python实战 | 三万字详解!GPT-5:你需要知道的一切(上)建议收藏!
  • 性能监控之Python实战SkyWalking链路追踪
  • [java][git]git学习
  • Linux动态库防止逆向编译参数
  • keil的debug功能
  • IT行业的未来:技术变革与创新的持续推动
  • 解决fatal: unable to access ‘https://........git/‘: Recv failure: Operation time
  • ~关于 CAS 机制、ABA问题、偏向锁、synchronized 实现原理、信号量、Callable
  • Prompt最佳实践|如何用参考文本让ChatGPT答案更精准?
  • 深入理解Kubernetes供应链安全:CKS考试核心知识点实践
  • 在 expressjs 中MySQL 的datetime类型,怎么插入数据
  • 使用java实现ffmpeg的各种操作
  • 使用现有的科技或许无法实现对人类智能的模拟
  • 从零开始,Docker进阶之路(一):Docker基础
  • LocalStorage
  • 力扣中等 33.搜索旋转排序数组
  • MySQL中的函数简单总结,以及TCL语句的简单讲解