Android读取assets目录JSON文件修改参数后无法写入问题求助
问题产生的核心原因
- Android的assets目录属于APK安装包的内置资源目录,仅支持只读操作,打包后无法直接修改该目录下的任何文件,你当前读取的是assets里的只读文件,天然不支持写入。
- 你的代码只完成了「读取JSON到内存 -> 修改内存中的JSONObject对象」的逻辑,完全没有编写将修改后的JSON内容写入文件的代码,修改仅停留在内存层面,进程退出后就会消失。
解决实现步骤
步骤1:首次启动时将assets下的json文件拷贝到APP私有可写目录
安卓APP的私有目录/data/data/你的包名/files/支持读写操作,先把内置的JSON文件拷贝到该目录,后续所有读写都操作该目录下的文件:
// 仅首次启动时执行拷贝操作 private void copyJsonToPrivateDirIfNeed() { File targetFile = new File(getFilesDir(), "tests.json"); if (targetFile.exists()) { return; // 已拷贝过无需重复操作 } try (InputStream is = getAssets().open("tests.json"); FileOutputStream fos = new FileOutputStream(targetFile)) { byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { fos.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } }
步骤2:修改读取逻辑,改为读取私有目录的文件
// 从私有目录读取JSON内容 private String loadJsonFromPrivateDir() { File jsonFile = new File(getFilesDir(), "tests.json"); try (FileInputStream fis = new FileInputStream(jsonFile)) { int size = fis.available(); byte[] buffer = new byte[size]; fis.read(buffer); return new String(buffer, StandardCharsets.UTF_8); } catch (IOException e) { e.printStackTrace(); return null; } }
步骤3:新增JSON内容写入方法
// 将修改后的JSON内容写入私有目录文件 private void saveJsonToPrivateDir(String jsonContent) { File jsonFile = new File(getFilesDir(), "tests.json"); try (FileOutputStream fos = new FileOutputStream(jsonFile)) { fos.write(jsonContent.getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { e.printStackTrace(); } }
步骤4:调整业务逻辑,修改后调用写入方法
try { JSONObject json = new JSONObject(loadJsonFromPrivateDir()); JSONArray jsonArray = json.getJSONArray("abouttests"); JSONObject userData = jsonArray.getJSONObject(position); userData.put("bestresult", rightanswercount); // 关键:将内存中修改后的JSON写入文件 saveJsonToPrivateDir(json.toString()); } catch (JSONException e) { e.printStackTrace(); }
注意事项
- 首次启动APP时要先调用
copyJsonToPrivateDirIfNeed()方法完成文件初始化,否则会出现私有目录找不到文件的问题 - 如果后续APK升级需要更新tests.json的默认内容,需要自行添加版本判断逻辑,避免直接覆盖用户已修改的本地数据
内容的提问来源于stack exchange,提问作者APTEMKA
相关产品推荐
相关产品推荐

