跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Java中使用PrintWriter写入文件时内容为空的解决方案

java中用printwriter向数组指定的多个文件写入内容却为空,根本原因是未正确关闭流;应使用try-with-resources自动管理资源,确保缓冲区刷新并释放文件句柄。 java 中用printwriter向数组指定的多个文件写入内容却为空,根本原因是未正确关闭流;应使用try-with-resources自动管理资源,确保缓冲区刷新并释放文件句柄。 在Java中,PrintWriter(以及底层的FileWriter或OutputStreamWriter)默认采用缓冲写入机制——数据先暂存于内存缓冲区,而非立即写入磁盘。若未显式调用 close() 或 flush(),缓冲区中的内容将不会落盘,导致文件被创建但内容为空。您提供的代码中虽成功创建了 output_1.txt 和 output_2.txt,但由于每次循环后既未刷新也未关闭 PrintWriter,所有写入操作均滞留在缓冲区中,程序结束时资源被强制回收,数据永久丢失。 ✅ 正确做法是: 始终使用 try-with-resources 语句 ,它能自动、可靠地调用 close()(进而触发 flush()),无论是否发生异常:
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.io.PrintWriter; String[] outputs = {"output_1.txt", "output_2.txt"}; for (String filename : outputs) { try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(Paths.get(filename)))) { writer.println("write this to file"); // 自动 flush + close 在 try 块结束时执行 } catch (IOException e) { System.err.println("写入文件失败: " + filename + " - " + e.getMessage()); } }
? 关键优势说明: 异常安全 :即使 writer.println() 抛出 IOException,close() 仍会在 finally 等效逻辑中执行,避免资源泄漏; 简洁可靠 :无需手动记忆 close() 调用位置,杜绝“忘记关闭”的低级错误; 现代标准 :Files.newBufferedWriter() 默认启用 UTF-8 编码,比原始 FileWriter 更健壮(后者依赖系统默认编码,易引发乱码)。 ⚠️ 补充注意事项: Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 立即学习 “ Java免费学习笔记(深入) ”; 若需追加写入(append),可传入 StandardOpenOption.APPEND: Files.newBufferedWriter(Paths.get(filename), StandardOpenOption.APPEND) 避免混用 PrintWriter 与 FileWriter 手动管理(如原代码中分别声明 file 和 writer),这不仅冗余,还可能因关闭顺序错误引发 IOException; PrintWriter 的构造函数中若传入 true(即 new PrintWriter(out, true)),可启用自动 flush 模式(仅对 println/printf/format 生效),但 仍不能替代 close() ——因为 close() 还负责释放底层文件句柄。 总结:文件为空 ≠ 写入失败,而是“写入未提交”。养成使用 try-with-resources 的习惯,是保障 I/O 操作健壮性与可维护性的第一步。

相关文章