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
相关产品推荐
相关产品推荐

