Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)

一、前言

在实际开发和面试中,经常会遇到这样一类问题:

  • JSON 文件数据很大,读取卡顿怎么办?
  • JSON 能不能当存储方案?
  • SQLite 能不能存 JSON?
  • 大数据应该用 JSON / KV / SQLite?
  • 写文件时断电,数据如何保证安全?

这些问题的本质不是 API,而是:

数据存储设计能力 + 工程可靠性能力

本文将从实际工程角度,系统讲清楚这些问题。


二、JSON 文件的本质

JSON 文件是什么?

复制代码
JSON 是一种数据交换格式,
文件只是它的载体。

👉 所以:

❗JSON ≠ 存储方案


JSON 文件适合什么场景?

  • 配置文件
  • 初始化数据
  • 导入导出
  • 小规模数据缓存

❌ 不适合

  • 大数据量
  • 高频更新
  • 复杂查询

三、JSON 文件为什么会卡?

问题本质

复制代码
全量加载 + 全量解析

❌ 常见错误

java 复制代码
String json = readAll();   // 一次读完
parse(json);               // 一次解析

问题

  • 内存占用高
  • 解析慢
  • UI 卡顿甚至 OOM

四、JSON 优化方案(核心)


1️⃣ 拆分大 JSON

复制代码
一个大 JSON → 多个小 JSON

👉 降低单次处理成本


2️⃣ JSON Lines(重点)

什么是 JSON Lines?

复制代码
每一行是一个 JSON 对象

示例:

复制代码
{"id":1,"name":"A"}
{"id":2,"name":"B"}
{"id":3,"name":"C"}

3️⃣ 流式解析(重点)

什么是流式解析?

复制代码
逐步读取 → 逐步处理 → 不全量加载

示例:

java 复制代码
BufferedReader reader = new BufferedReader(new FileReader(file));

String line;
while ((line = reader.readLine()) != null) {
    parse(line);
}

本质

❗避免一次性加载全部数据

五、SQLite 能不能存 JSON?

结论

复制代码
可以存,但不推荐存"大 JSON"

❌ 为什么不推荐?

  • 需要整块解析
  • 无法利用索引
  • 无法局部更新
  • 性能差

✅ 正确方式

复制代码
JSON → 拆结构 → 表结构

六、KV 是什么?

❓KV 存储

复制代码
Key-Value(键值对)
类似 HashMap,但可持久化

❓适用场景

  • 配置
  • 状态
  • 小数据高频读写

❌ 不适合

  • 大数据
  • 复杂结构
  • 查询需求

七、JSON / KV / SQLite 如何选型?

选型原则

复制代码
JSON:小数据 + 低频
KV:简单数据 + 高频
SQLite:结构化数据 + 查询

❗关键判断

复制代码
是否结构化
是否需要查询
是否需要局部更新

八、大 JSON 正确处理方案

❌ 错误方式

复制代码
超大 JSON → SQLite TEXT

✅ 正确方案

1️⃣ 拆结构(推荐)

复制代码
JSON → 表结构

2️⃣ 分片文件

复制代码
data_1.json
data_2.json

3️⃣ JSON Lines + 流式处理

九、断电数据安全(面试重点)


问题

复制代码
写文件过程中断电怎么办?

❌ 错误方式

复制代码
直接覆盖原文件

👉 风险:

  • 文件损坏
  • 数据丢失

✅ 正确方案(核心)

复制代码
1. 写入临时文件
2. fsync 确保落盘
3. rename 原子替换

核心原理

❗rename = 原子替换文件


保证

复制代码
要么旧数据在
要么新数据完整
不会损坏

十、面试高分总结

🎯 三大核心

复制代码
性能:避免全量加载
安全:避免直接覆盖
架构:选择合适存储方案

🔥 一句话总结

❗JSON 决定数据格式,KV/SQLite 决定存储能力,架构决定是否合理。


十一、结语

这类问题的本质不是:

❌ 会不会用 JSON / SQLite

而是:

是否具备数据建模 + 工程设计能力

相关推荐
JL1510 分钟前
Java并发编程面试全攻略-从synchronized到AQS底层原理
java·开发语言·面试·并发编程
程序员爱钓鱼26 分钟前
Go 编程实战:数组 Array——固定长度的数据集合
后端·面试·go
ue星空1 小时前
第一个安卓程序
android
淡淡的香烟1 小时前
Androidiot蓝牙配网简单封装
android·物联网
gxgldyh1 小时前
Android Framework源码解析(九):App进程诞生全流程——从AMS请求到Zygote fork源码深度拆解
android·framework·zygote·android 启动流程·android app创建流程
ShineWinsu8 小时前
对于C++:auto_ptr、unique_ptr、shared_ptr的模拟实现
c++·面试·笔试·智能指针·unique_ptr·shared_ptr·auto_ptr
牛哇网络工作室8 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
bugcome_com9 小时前
JWT 知识小课堂:从入门到精通,一文吃透 JSON Web Token
前端·json
一笑的小酒馆9 小时前
Androidiot蓝牙配网简单封装
android
黄敬峰11 小时前
一文搞懂 NestJS 后端框架:工厂模式、模块化与装饰器
面试