上一篇
安卓开发保存数据到本地文件格式
- 行业动态
- 2025-04-23
- 7
安卓本地存储可将数据写入内部或外部文件,通过FileOutputStream/FileWriter操作,需申请WRITE_EXTERNAL_STORAGE权限(Android 10+需MANAGE_EXTERNAL_STORAGE),推荐使用getFilesDir()获取应用私有目录,采用MODE_PRIVATE模式确保数据
安卓本地文件存储详解
文件存储基础概念
安卓文件存储分为内部存储和外部存储两种类型:
| 存储类型 | 访问权限 | 生命周期 | 典型用途 |
|———|———|———-|———-|
| 内部存储 | 应用私有 | 随应用卸载删除 | 配置文件、缓存数据 |
| 外部存储 | 公共读写 | 持久保留 | 媒体文件、共享文档 |
文件操作核心步骤
创建文件路径
// 内部存储路径(无需申请权限) File file = new File(getFilesDir(), "config.txt"); // 外部存储路径(需申请MANAGE_EXTERNAL_STORAGE权限) File externalFile = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "avatar.png");
写入文件
// 写入文本文件 try (FileOutputStream fos = openFileOutput("data.txt", Context.MODE_PRIVATE)) { fos.write("Hello World".getBytes()); } catch (IOException e) { e.printStackTrace(); } // 写入二进制文件(如图片) try (FileOutputStream fos = new FileOutputStream(externalFile)) { bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); } catch (IOException e) { e.printStackTrace(); }
读取文件
// 读取文本文件 try (FileInputStream fis = openFileInput("data.txt")) { byte[] buffer = new byte[fis.available()]; fis.read(buffer); String content = new String(buffer); } catch (IOException e) { e.printStackTrace(); } // 读取二进制文件 try (FileInputStream fis = new FileInputStream(externalFile)) { Bitmap bitmap = BitmapFactory.decodeStream(fis); } catch (IOException e) { e.printStackTrace(); }
特殊数据类型存储方案
数据类型 | 推荐格式 | 实现方式 |
---|---|---|
文本配置 | UTF-8编码 | BufferedWriter 逐行写入 |
JSON对象 | .json 文件 |
Gson /Jackson 序列化 |
XML配置 | .xml 文件 |
XmlSerializer 接口 |
二进制资源 | 原始字节流 | 直接写入文件输出流 |
示例:保存JSON对象
// 使用Gson库序列化对象 User user = new User("John", 25); try (FileWriter writer = new FileWriter(new File(getFilesDir(), "user.json"))) { new Gson().toJson(user, writer); } catch (IOException e) { e.printStackTrace(); }
关键注意事项
运行时权限管理
- Android 6.0+需动态申请
WRITE_EXTERNAL_STORAGE
- Android 10+建议使用
MediaStore
API替代直接文件操作
- Android 6.0+需动态申请
存储空间校验
// 检查外部存储可用性 if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { // 执行存储操作 } else { // 提示用户插入存储设备 }
大文件处理优化
- 使用
BufferedInputStream/OutputStream
提高IO效率 - 分块读写避免内存溢出(适用于>10MB文件)
- 使用
沙盒机制限制
- 默认情况下只能访问应用专属目录
- 跨应用共享文件需使用
content://
URI方案
常见问题解答
Q1:如何选择文件存储与其他存储方式?
A:根据数据特征选择:
- 简单键值对 →
SharedPreferences
(XML格式) - 结构化数据 → SQLite/Room(数据库文件)
- 多媒体资源 → 文件存储(如
.jpg
/.mp3
) - 临时计算结果 → 内存缓存(非持久化)
Q2:如何处理Android 11+的分区存储限制?
A:推荐方案:
- 使用
MediaStore
API操作媒体文件 - 通过
Storage Access Framework
获取文件URI - 申请
MANAGE_EXTERNAL_STORAGE
权限(仅限特定场景)
示例代码:// 通过系统文件选择器获取目标文件 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("/"); startActivityForResult(intent, REQUEST_CODE_SELECT_FILE);