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

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

相关文章:

Android 数据持久化之 文件存储

在 Android 开发中,存储文件是一个常见的需求。文件存储对数据不进行任何格式化处理,原封不动地保存到文件中。适合存储一些简单的文本数据或者二进制数据。 一、存储路径 根据文件的存储位置和访问权限,可以将文件存储分为内部存储(Internal Storage)和外部存储(Exter…...

TAPIP3D:持久3D几何中跟踪任意点

简述 在视频中跟踪一个点&#xff08;比如一个物体的某个特定位置&#xff09;听起来简单&#xff0c;但实际上很复杂&#xff0c;尤其是在3D空间中。传统方法通常在2D图像上跟踪像素&#xff0c;但这忽略了物体的3D几何信息和摄像机的运动&#xff0c;导致跟踪不稳定&#xf…...

数据分析预备篇---NumPy数组

NumPy是数据分析时常用的库,全称为Numerical Python,是很多数据或科学相关Python包的基础,包括pandas,scipy等等,常常被用于科学及工程领域。NumPy最核心的数据结构是ND array,意思是N维数组。 #以下是一个普通列表的操作示例:arr = [5,17,3,26,31]#打印第一个元素 prin…...

uniapp 生成海报二维码 (微信小程序)

先下载qrcodenpm install qrcode 调用 community_poster.vue <template><view class"poster-page"><uv-navbar title"物业推广码" placeholder autoBack></uv-navbar><view class"community-info"><text clas…...

16.Excel:数据收集

一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用&#xff0c;而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候&#xff0c;会制作表头给填写人&#xff0c;最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…...

AI系列:智能音箱技术简析

AI系列&#xff1a;智能音箱技术简析 智能音箱工作原理详解&#xff1a;从唤醒到执行的AIPipeline-CSDN博客 挑战真实场景对话——小爱同学背后关键技术深度解析 - 知乎 (zhihu.com) AI音箱的原理&#xff0c;小爱同学、天猫精灵、siri。_小爱同学原理-CSDN博客 智能音箱执行步…...

【网络安全】——大端序(Big-Endian)​​和​​小端序(Little-Endian)

字节序&#xff08;Endianness&#xff09;是计算机系统中多字节数据&#xff08;如整数、浮点数&#xff09;在内存中存储或传输时&#xff0c;​​字节排列顺序​​的规则。它分为两种类型&#xff1a;​​大端序&#xff08;Big-Endian&#xff09;​​和​​小端序&#xf…...

如何通过服务主体获取 Azure 凭据

本文详细讲解如何通过 Azure 服务主体生成凭据,使应用程序能够安全访问 Azure 资源(如部署 Container Apps)。以下步骤基于 Azure Portal 操作,适用于自动化部署、CI/CD 等场景。 步骤 1:登录 Azure Portal 访问 Azure 门户。使用 Azure 账户(需具备订阅管理员权限)登录…...

BUUCTF——Ezpop

BUUCTF——Ezpop 进入靶场 给了php代码 <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected $v…...

三、Hadoop1.X及其组件的深度剖析

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 一、Hadoop 1.X 概述 &#xff08;一&#xff09;概念 Hadoop 是 Apache 开发的分布式系统基础架构&#xff0c;用 Java 编写&#xff0c;为集群处理大型数据集提供编程模型&#xff0c;…...

MySQL(5)如何创建数据库和表?

在 MySQL 中创建数据库和表是进行数据存储和管理的基础操作。以下是详细的步骤和示例代码&#xff0c;涵盖从连接 MySQL、创建数据库、创建表到插入数据的全过程。 步骤一&#xff1a;连接 MySQL 服务器 首先&#xff0c;我们需要连接到 MySQL 服务器&#xff0c;可以使用命令…...

LeetCode 热题 100 131. 分割回文串

LeetCode 热题 100 | 131. 分割回文串 大家好&#xff0c;今天我们来解决一道经典的回溯算法问题——分割回文串。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求将一个字符串 s 分割成若干个子串&#xff0c;使得每个子串都是回文串&#xff0c;并返回所有可能的分割…...

PDF2zh插件在zotero中安装并使用

1、首先根据PDF2zh说明文档&#xff0c;安装PDF2zh https://github.com/guaguastandup/zotero-pdf2zh/tree/v2.4.0 我没有使用conda&#xff0c;直接使用pip安装pdf2zh &#xff08;Python版本要求3.10 < version <3.12&#xff09; pip install pdf2zh1.9.6 flask pypd…...

springboot3+vue3融合项目实战-大事件文章管理系统-更新用户密码

大致分为这三步 首先在usercontroller中增加updatePwd方法 PatchMapping ("/updatePwd")public Result updatePwd(RequestBody Map<String,String> params){//1.校验参数String oldPwd params.get("old_pwd");String newPwd params.get("n…...

从颜料混色到网络安全:DH算法的跨界智慧

一、颜料混色的秘密 想象一下&#xff0c;你和朋友各自有一罐私密的颜料&#xff0c;但你们想共同调出一种只有彼此知道的新颜色&#xff0c;而旁观者即使看到你们的操作也无法复现。奇怪的是&#xff0c;你们全程没有直接交换颜料&#xff0c;却能达成共识——这就是**迪菲-赫…...

C++GO语言socket套接字

目录 01 06-socket-client-server通信过程分析 02 07-socket-server-单次处理 03 08-socket-client 01 09-socket-server-多连接建立 02 10-socket-client多次发送数据 01 -socket-client-server通信过程分析 ### - Server Demo接收一个链接&#xff0c;而且只能发送一次数…...

WebSocket:实时通信的新时代

在现代Web应用中&#xff0c;实时通信变得越来越重要。传统的HTTP协议虽然能够满足基本的请求-响应模式&#xff0c;但在需要频繁更新数据的场景下&#xff0c;其效率和性能显得捉襟见肘。WebSocket协议应运而生&#xff0c;它提供了一种在单个TCP连接上进行全双工通信的机制&a…...

(四)YOLO_World-SAM-GraspNet的mujoco抓取仿真(操作记录)

一、创建虚拟环境 这里直接克隆之前项目的环境 &#xff08;二&#xff09;Graspnet在mujoco的仿真复现&#xff08;操作记录&#xff09;_graspnet仿真-CSDN博客 conda create -n graspnet --clone mujoco_graspnet conda activate graspnet 二、安装额外的环境包 pip in…...

IT/OT 融合架构下的工业控制系统安全攻防实战研究

1. 引言 随着工业 4.0 和智能制造的浪潮席卷全球&#xff0c;信息技术 (IT) 与运营技术 (OT) 的融合已成为不可逆转的趋势。这种融合旨在通过实时数据交换和分析&#xff0c;打破传统的信息孤岛&#xff0c;显著提升生产效率、优化决策、降低运营成本并增强市场竞争力。IT 系统…...

基于Qt的app开发第六天

写在前面 博主是一个大一下的计科生&#xff0c;现在正在做C面向对象程序设计的课程设计&#xff0c;具体功能可以看本专栏的第一篇博客。 目前的进度是&#xff1a;配好MySQL驱动->设计完界面->实现各个界面的切换 这一篇博主要初步实现待办板块的功能&#xff0c;即新建…...

npm create vite@latest my-vue-app 解读

背景发荧光的样式。 filter属性的学习&#xff1a;filter - CSS&#xff1a;层叠样式表 | MDN 复习一下em 组件的调用: 是msg让“ViteVue”显示出来的&#xff01;&#xff01; a标签的targte属性&#xff1a; 组件之间怎么传值的&#xff1a; &#xff0c;没看懂code标签怎么…...

【SpringCloud GateWay】Connection prematurely closed BEFORE response 报错分析与解决方案

一、背景 今天业务方调用我们的网关服务报错: Connection prematurely closed BEFORE response二、原因分析 三、解决方案 第一步: 增加 SCG 服务的JVM启动参数,调整连接获取策略。 将连接池获取策略由默认的 FIFO&#xff08;先进先出&#xff09;变更为 LIFO&#xff08…...

ABP vNext 集成高性能、高可靠 MQTT 服务器实战

&#x1f680; ABP vNext 集成高性能、高可靠 MQTT 服务器实战 &#x1f527; 本文将从实战出发&#xff0c;带你一步步在 ABP vNext 框架中集成 MQTT 服务&#xff0c;构建一个高性能、高可靠的物联网通信平台。适合 IoT 系统、智能硬件平台和实时监控场景。 &#x1f6e0;️ …...

PD快充诱骗协议芯片XSP04D与主板共用一个Type-C和电脑传输数据

随着智能电子产品的广泛应用&#xff0c;快充方案越来越受到重视&#xff0c;且迭代次数也更加频繁。在一些使用频率较高、耗电较大的电子产品中&#xff0c;快充方案也成为了大多数人的追求&#xff0c;它能很大程度上缩短充电的时间&#xff0c;例如XSP04D这款快充诱骗协议方…...

goland无法debug

goland无法使用debug&#xff0c;修复_goland无法debug-CSDN博客...

ECLIC中断流程及实际应用 —— RISC-V中断机制(二)

在长期的嵌入式开发实践中&#xff0c;对中断机制的理解始终停留在表面层次&#xff0c;特别当开发者长期局限于纯软件抽象层面时&#xff0c;对中断机制的理解极易陷入"知其然而不知其所以然"的困境&#xff0c;这种认知的局限更为明显&#xff1b;随着工作需要不断…...

【网络分析工具】网络工具wireshark、TCPdump、iperf使用详解

这里写目录标题 1. wireshark1.1. 过滤包1.2. 常见分析 2. tcpdump3. iperf 1. wireshark **ip.dst eq 10.0.0.21** 是用于网络流量分析工具&#xff08;例如 Wireshark 或 tcpdump&#xff09;的过滤器表达式。 它的作用是筛选出所有目标IP地址为 10.0.0.21 的数据包 IP.add…...

debian中笔记本的省电选择auto-cpufreq

在reddit中&#xff0c;看评论区出现这个软件&#xff0c;于是打算尝试一下&#xff0c;应该能对不使用电源时笔记本的省电起到一定的作用。 https://github.com/AdnanHodzic/auto-cpufreq?tabreadme-ov-file#why-do-i-need-auto-cpufreq 作用 One of the problems with Linux…...

力扣热题100之环形链表 II

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使…...

【记录】HunyuanVideo 文生视频工作流

HunyuanVideo 文生视频工作流指南 概述 本指南详细介绍如何在ComfyUI中使用腾讯混元HunyuanVideo模型进行文本到视频生成的全流程操作&#xff0c;包含环境配置、模型安装和工作流使用说明。 参考&#xff1a;https://comfyui-wiki.com/zh/install/install-comfyui/install-c…...