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

Gson结合FileWriter写入文件不完整问题求助

Gson写入JSON文件时内容被截断的解决方案

看起来你遇到的是典型的字符流缓冲区未刷新/关闭导致数据丢失的问题,我来帮你拆解一下原因和解决办法:

问题根源

你使用的FileWriter属于带缓冲区的字符输出流,它会先把数据暂存在内存缓冲区里,只有当缓冲区填满、或者你手动触发刷新/关闭操作时,才会把缓冲区里的内容写入磁盘。

你看到的固定截断位置和文件大小(106,496字节、49,152字节)其实就是默认缓冲区的大小——程序结束前没处理缓冲区,导致最后一批没填满缓冲区的数据直接留在内存里,根本没写到文件里,所以每次都会在相同位置截断。

修正方案(推荐两种方式)

方式1:用try-with-resources自动管理资源(Java 7+最优解)

这种方式会在代码块结束时自动关闭Writer,关闭时会自动触发缓冲区刷新,完全不用手动处理:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
// try-with-resources语法,括号里的资源会自动关闭
try (Writer writer = new FileWriter(location)) {
    gson.toJson(data, writer);
} catch (IOException e) {
    // 这里可以替换成你项目里的异常处理逻辑,比如日志记录
    e.printStackTrace();
}

方式2:手动刷新并关闭Writer

如果你的Java版本低于7,就用这种方式,确保在finally块里关闭资源:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
Writer writer = null;
try {
    writer = new FileWriter(location);
    gson.toJson(data, writer);
    writer.flush(); // 强制把缓冲区剩余数据写入磁盘
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (writer != null) {
        try {
            writer.close(); // 关闭流时也会自动执行flush
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

额外说明

  • 不管你开不开setPrettyPrinting(),缓冲区机制都是存在的,所以两种场景下都会出现截断,只是缓冲区对应的字节数不同而已。
  • 如果你的data数据量特别大,不建议先把JSON转成字符串再写入(比如gson.toJson(data)后再用FileWriter写),那样会占用大量内存,还是用流的方式更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:46:14