Java写入文件异常:文件创建但无内容,求PrintWriter/FileWriter调试方案
问题原因及解决方法
你的问题根源很直接:Writer类的缓冲区没被刷新或关闭,导致写入的内容一直停留在内存里,没有真正写入磁盘文件。
具体问题点
代码里每次循环创建了PrintWriter和FileWriter,但写完内容后没做这两个关键操作:
- 调用
writer.flush():强制把缓冲区内容刷入文件 - 调用
writer.close():关闭流时会自动触发flush,同时释放底层文件资源
而且循环中每次重新赋值writer和file,前一次的流资源没被释放,属于资源泄漏问题。
修复方案
方案1:手动关闭流(循环内处理)
修改代码,每次写完后立即关闭PrintWriter:
String[] outputs = {"output_1.txt", "output_2.txt"}; PrintWriter writer = null; for(int i = 0; i < outputs.length; i++){ try { writer = new PrintWriter(new FileWriter(outputs[i])); writer.println("write this to file"); } catch (IOException e) { e.printStackTrace(); // 捕获异常方便排查问题 } finally { if(writer != null) { writer.close(); // 关闭时自动刷新缓冲区 } } }
方案2:使用try-with-resources语法(推荐)
Java 7+支持的自动资源管理语法,流会在代码块结束后自动关闭,无需手动操作:
String[] outputs = {"output_1.txt", "output_2.txt"}; for(int i = 0; i < outputs.length; i++){ try (PrintWriter writer = new PrintWriter(new FileWriter(outputs[i]))) { writer.println("write this to file"); // 无需手动close,代码块结束自动关闭流 } catch (IOException e) { e.printStackTrace(); } }
调试小技巧
- 想验证是不是缓冲区问题,可以在
writer.println()后加一行writer.flush(),执行后查看文件是否有内容 - 必须捕获
IOException,很多写入失败的情况都是因为没处理异常,看不到错误信息
内容的提问来源于stack exchange,提问作者erica_on_strike
相关产品推荐
相关产品推荐

