Android Studio Java开发如何实现JSON文件存储所有输入数据不覆盖
问题核心原因
- 当前
FileWriter默认使用覆盖写入模式,每次写文件都会清空原有内容 - 存储结构为单个
JSONObject,没有收纳多条数据的容器,就算改为追加写入也会生成格式非法的JSON内容,无法正常解析
修改实现方案
核心逻辑:每次保存新数据前,先读取本地已存储的所有历史数据,解析为JSONArray,把新输入的内容封装为JSONObject追加到数组末尾后,再将完整数组写回文件即可。
修改后的代码如下:
saveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { String getName = editTextFileName.getText().toString(); String getData = editTextData.getText().toString(); // 封装新的输入数据为JSONObject JSONObject newUser = new JSONObject(); newUser.put("Name", getName); newUser.put("Enroll_No", getData); newUser.put("Mobile", "4.example"); newUser.put("Address", "4.example"); newUser.put("Branch", "4.example"); File file = new File(context.getFilesDir(), "user.json"); JSONArray userArray = new JSONArray(); // 先读取本地已有的历史数据 if (file.exists() && file.length() > 0) { FileInputStream fis = context.openFileInput("user.json"); int size = fis.available(); byte[] buffer = new byte[size]; fis.read(buffer); fis.close(); String jsonStr = new String(buffer, StandardCharsets.UTF_8); // 把已有内容解析为JSONArray userArray = new JSONArray(jsonStr); } // 把新数据追加到数组末尾 userArray.put(newUser); // 把完整数组写回文件,覆盖原有内容 FileWriter fileWriter = new FileWriter(file); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write(userArray.toString()); bufferedWriter.close(); } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } });
读取所有录入数据的示例
需要查看全量数据时,直接读取user.json文件解析为JSONArray遍历即可:
try { File file = new File(context.getFilesDir(), "user.json"); if (file.exists() && file.length() > 0) { FileInputStream fis = context.openFileInput("user.json"); int size = fis.available(); byte[] buffer = new byte[size]; fis.read(buffer); fis.close(); String jsonStr = new String(buffer, StandardCharsets.UTF_8); JSONArray userArray = new JSONArray(jsonStr); // 遍历获取所有数据 for (int i = 0; i < userArray.length(); i++) { JSONObject user = userArray.getJSONObject(i); String name = user.getString("Name"); String enrollNo = user.getString("Enroll_No"); // 这里处理每条数据,比如渲染到列表控件里 } } } catch (IOException | JSONException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Muratcan Yıldız
相关产品推荐
相关产品推荐

