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

Android中写入JSON文件无报错但未生效问题求助

Android 内部存储写入JSON文件无内容问题排查与修复

核心问题分析

你的代码存在几个关键错误导致写入无效果:

  • openFileOutput参数错误:该方法的第一个参数应为文件名,而非完整路径。传入完整路径会导致文件被创建在错误的嵌套路径(如getFilesDir()/getFilesDir()/test.json),你检查的文件和实际写入的并非同一个。
  • 多流操作冲突:同时使用三种写入方法操作同一个文件,会导致流竞争、内容被覆盖,甚至部分写入操作未生效。
  • 流未确保刷新/关闭:部分流操作未显式刷新或正确关闭,导致内存中的内容未同步到磁盘。

修复方案与代码示例

方案1:使用Gson写入自定义对象(推荐)

使用try-with-resources语法自动管理流,确保流正确关闭,同时统一路径获取方式:

public class PlayerData {
    private int gold;
    private int wins;
    private int losses;

    public PlayerData(){
        gold = 0;
        wins = 0;
        losses = 0;
    }
}

// 写入逻辑
try {
    Gson gson = new Gson();
    String fileName = "test.json";
    File file = new File(getApplicationContext().getFilesDir(), fileName);

    // try-with-resources自动关闭流
    try (FileWriter writer = new FileWriter(file)) {
        gson.toJson(new PlayerData(), writer);
        writer.flush(); // 显式刷新确保内容写入磁盘
    }

    Toast.makeText(getApplicationContext(), "写入完成", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(getApplicationContext(), "写入失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}

方案2:使用FileOutputStream写入字符串

注意openFileOutput仅传入文件名,系统会自动在getFilesDir()目录下创建文件:

try {
    String content = "gjsanhfhj";
    String fileName = "test.json";

    try (FileOutputStream outputStream = openFileOutput(fileName, Context.MODE_PRIVATE)) {
        outputStream.write(content.getBytes());
        outputStream.flush();
    }

    Toast.makeText(getApplicationContext(), "写入完成", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(getApplicationContext(), "写入失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}

验证写入结果

你可以通过两种方式确认文件是否写入成功:

  1. Android Studio Device File Explorer:找到data/data/你的应用包名/files/test.json,查看文件内容。
  2. 代码读取验证:
try {
    String fileName = "test.json";
    File file = new File(getApplicationContext().getFilesDir(), fileName);
    if (file.exists()) {
        String content = new String(Files.readAllBytes(file.toPath()));
        Log.d("FileContent", "文件内容:" + content);
    } else {
        Log.d("FileStatus", "文件不存在");
    }
} catch (Exception e) {
    e.printStackTrace();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:39