You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:57:08