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

Android 数据持久化之 文件存储

在 Android 开发中,存储文件是一个常见的需求。文件存储对数据不进行任何格式化处理,原封不动地保存到文件中。适合存储一些简单的文本数据或者二进制数据。

一、存储路径

根据文件的存储位置和访问权限,可以将文件存储分为内部存储(Internal Storage)和外部存储(External Storage)。

1、内部存储(Internal Storage)

  • 私有存储空间
    内部存储是应用私有的存储空间,其他应用无法访问。它适用于存储敏感信息或应用专用的数据。
  • 不需特殊权限
    内部存储的文件路径是应用私有的,不需要特殊权限。
  • 文件路径
    内部存储的文件路径通常位于 /data/data/你的应用包名/ 目录下。但是从 Android 6.0(API 级别 23)开始,Google 引入了多用户支持,这导致了内部存储路径的变化,路径从 /data/data/你的应用包名/ 变为 /data/user/0/你的应用包名/
  • 多用户支持
    每个用户的数据都存储在独立的目录中,路径格式为 /data/user/用户ID/。0 是默认用户的用户 ID,如果你的设备上只有一个用户,那么 /data/user/0/ 就是默认用户的内部存储路径。
  • 路径映射
    在多用户支持的系统中,/data/data/包名/ 是一个符号链接,它指向 /data/user/0/包名/。这两个路径实际上是相同的,指向同一个物理目录。
  • 文件访问
    使用 Context 提供的方法(如 filesDir、cacheDir、getDatabasePath() 等)来访问内部存储路径。
  • 文件大小
    内部存储的文件大小通常没有限制,但建议不要存储过大的文件,以免影响应用性能。
    /*** 获取内部存储路径: /data/user/0/<packageName>/*/fun getInternalPath(context: Context) {// 获取文件目录路径: /data/user/0/你的应用包名/files/val filePath =  context.filesDir.absolutePath// 获取缓存目录路径: /data/user/0/你的应用包名/cache/val cachePath = context.cacheDir.absolutePath// 获取数据库文件路径: /data/user/0/你的应用包名/databases/my_database.dbval dbPath = context.getDatabasePath("my_database.db").absolutePath}

2、外部存储(External Storage)

  • 共享存储空间
    外部存储是共享的存储空间,其他应用可以访问。从 Android 10(API 级别 29)开始,外部存储的访问方式发生了变化,引入了分区存储(Scoped Storage)。如果你的应用目标 API 级别是 29 或更高,分区存储是强制性的。
  • 需要特殊权限
    外部存储需要 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 权限。从 Android 10 开始,建议使用分区存储,减少对这些权限的依赖。
  • 分区存储
    从 Android 10 开始,推荐使用分区存储。分区存储限制了应用对用户文件的访问,以保护用户隐私。推荐使用 MediaStore API 来访问外部存储中的媒体文件(图片、音频和视频文件)。
  • 外部存储路径
    外部存储路径通常位于 /storage/emulated/0/,这是用户可以访问的共享存储空间。通过 Environment.getExternalStorageDirectory().absolutePath 获取。
  • 应用专用外部存储路径
    应用专用外部存储路径是应用私有的,其他应用无法访问。路径通常位于 /storage/emulated/0/Android/data/你的应用包名/。通过 context.getExternalFilesDir(null).absolutePath 来获取。
  • 公共目录路径
    公共目录路径是所有应用都可以访问的共享存储路径,例如 Pictures、Documents、Movies 等。
  • 使用 Storage Access Framework (SAF)
    对于需要用户选择文件或存储位置的场景,可以使用 Storage Access Framework (SAF)。
    /*** 外部存储路径: /storage/emulated/0/*/fun getExternalPath(context: Context) {// 获取应用专用外部存储路径: /storage/emulated/0/Android/data/你的应用包名/filesval filePath = context.getExternalFilesDir(null)?.absolutePath ?: ""// 获取外部存储路径: /storage/emulated/0val filePathEnv = Environment.getExternalStorageDirectory().absolutePath// 获取图片公共目录路径: /storage/emulated/0/Picturesval picturesPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePathLog.d("FileStorage", "[getExternalFilePath] filePath: $filePath, filePathEnv: $filePathEnv")}

3、使用 MediaStore API 访问媒体文件

4、使用 SAF 打开文件选择器

二、File 方式

在 Android 开发中,使用 File 类来存取数据是一种常见的方法。File 类提供了对文件系统的基本操作,包括创建、读取、写入和删除文件。

1、读写内部存储文件

    /*** 读写内部存储文件*/fun writeReadFile(context: Context

相关文章:

  • 超详细讲解注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制
  • Java响应实体【R】
  • 如何对外包团队进行有效的管理?
  • Day19 常见的特征筛选算法
  • 代码随想录第39天:单调栈
  • 零拷贝的简单复习
  • Python核心数据结构深度对比:列表、字典、元组与集合的异同与应用场景
  • 深度解析语义分割评估指标:从基础到创新实践
  • DataWorks快速入门
  • 预渲染 Prerender
  • pm2如何执行脚本批量启动多个服务
  • 77.组合问题
  • C++ STL入门:vecto容器
  • nextjs站点地图sitemap添加
  • 算法题(142):木材加工
  • Music AI Sandbox:打开你的创作新世界
  • java使用MinIO,虚拟机时间异常
  • Typora安装使用教程,图片相对储存路径路径设置
  • 滚珠导轨:电子制造领域精密运动的核心支撑
  • 跨线程和跨进程通信还有多种方式对比
  • 工行回应两售出金条疑似有杂质:情况不属实,疑似杂质应为金条售出后的外部附着物
  • 海关总署统计分析司司长:4月进出口增速较一季度加快4.3个百分点
  • 英国和美国就关税贸易协议条款达成一致
  • 上海发布预付卡消费“10点提示”:警惕“甩锅闭店”套路
  • 招行:拟出资150亿元全资发起设立金融资产投资公司
  • 花20万骑自行车?CityRide带火“骑行经济”