You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android项目中JSON写入int失败,重启后覆盖文件问题求助

解决Android中JSON文件无法写入、重启后不生效的问题

嘿,我一眼就看出问题所在了——你现在操作的是assets目录下的JSON文件,这个目录里的文件是打包进APK的只读资源,根本没法直接修改!要实现退出重启后仍能保留修改的效果,得把文件复制到App的可读写存储目录,之后所有读写操作都围绕这个副本进行。

下面是完整的解决方案,一步步来:

1. 把assets里的JSON复制到内部存储

先写个工具方法,检查内部存储里有没有我们的JSON文件,如果没有就从assets复制过去:

private void copyJsonToInternalStorage() {
    // 内部存储的文件路径:/data/data/你的包名/files/useriidd.json
    File internalFile = new File(getFilesDir(), "useriidd.json");
    if (!internalFile.exists()) {
        try (InputStream is = getAssets().open("useriidd.json");
             OutputStream os = new FileOutputStream(internalFile)) {
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 修改读取方法,读取内部存储的文件

把你原来的getJsonFile()改成读取内部存储的副本,而不是assets里的只读文件:

public String getJsonFile() {
    // 先确保文件已复制到内部存储
    copyJsonToInternalStorage();
    
    File internalFile = new File(getFilesDir(), "useriidd.json");
    StringBuilder jsonContent = new StringBuilder();
    
    try (BufferedReader reader = new BufferedReader(new FileReader(internalFile))) {
        String line;
        while ((line = reader.readLine()) != null) {
            jsonContent.append(line);
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return jsonContent.toString();
}

3. 实现写入方法,保存修改后的userid

现在可以写一个方法,把int类型的userid写入到JSON文件里了。注意原JSON里的userid是字符串类型,所以这里把int转成String存储;如果你想改成int类型,直接把原JSON里的"0"改成0,然后写入时直接put int值就行:

public void saveUserIdToJson(int newUserId) {
    try {
        // 读取当前JSON内容
        String jsonStr = getJsonFile();
        JSONObject rootObj = new JSONObject(jsonStr);
        JSONObject userObj = rootObj.getJSONObject("user");
        
        // 修改userid:如果原JSON是字符串类型,转成String存入;如果是int类型直接put(newUserId)
        userObj.put("userid", String.valueOf(newUserId));
        
        // 把修改后的JSON写回文件
        File internalFile = new File(getFilesDir(), "useriidd.json");
        try (FileWriter writer = new FileWriter(internalFile)) {
            writer.write(rootObj.toString());
            writer.flush();
        }
    } catch (JSONException | IOException e) {
        e.printStackTrace();
    }
}

4. 使用示例

当你需要保存userid时,直接调用:

// 比如保存userid为123
saveUserIdToJson(123);

退出App重启后,调用getJsonFile()就能读到修改后的{"user": {"userid":"123"}}了。

额外注意点

  • 如果你需要外部存储(比如让用户能看到这个文件),可以把getFilesDir()换成getExternalFilesDir(null),记得要申请外部存储权限(Android 10及以上不需要,但低版本需要)。
  • 操作JSON时尽量用try-with-resources语法,避免流泄漏。

内容的提问来源于stack exchange,提问作者Nygards

火山引擎 最新活动