java中用printwriter向数组指定的多个文件写入内容时,若未显式关闭流,会导致文件为空;推荐使用try-with-resources语法自动管理资源,确保数据写入并安全释放。
java
中用printwriter向数组指定的多个文件写入内容时,若未显式关闭流,会导致文件为空;推荐使用try-with-resources语法自动管理资源,确保数据写入并安全释放。
在Java中,向多个文件批量写入内容是一个常见需求,例如将不同数据集分别保存为 output_1.txt、output_2.txt 等。但如示例代码所示,仅创建 PrintWriter 并调用 println() 是不够的——
数据可能仍停留在缓冲区中,未真正写入磁盘,且文件句柄未释放
。根本原因在于:PrintWriter(及其底层 FileWriter)默认启用缓冲,而 close() 既是刷新缓冲区(flush())也是释放系统资源的关键操作。
原始代码的问题在于:
每次循环都新建 FileWriter 和 PrintWriter,但从未调用 close();
缺少异常处理,一旦中间发生 I/O 异常(如磁盘满、权限不足),程序可能提前终止,导致后续文件未写入、已打开的流泄漏。
✅ 正确做法:使用
try-with-resources
(JDK 7+),它能自动调用 close()(等价于先 flush() 再关闭),无论是否发生异常:
? 关键说明:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
Files.newBufferedWriter(Paths.get(filename)) 返回 BufferedWriter,比直接使用 FileWriter 更高效(带缓冲),且支持指定字符编码(如 .newBufferedWriter(path, StandardCharsets.UTF_8));
try (Resource res = ...) 中声明的资源必须实现 AutoCloseable 接口(PrintWriter 符合);
try-with-resources 在语句块结束时
自动执行 close()
,即使内部抛出异常也会保证执行,彻底避免资源泄漏。
⚠️ 注意事项:
不要在 try-with-resources 外部再调用 writer.close(),否则会触发 IllegalStateException;
若需实时查看输出(如调试),可显式调用 writer.flush(),但通常不必要——close() 已隐含刷新;
避免在循环外复用同一个 PrintWriter 实例写多个文件,因它绑定单个底层流。
总结:
永远不要依赖 GC 来关闭文件流
。坚持使用 try-with-resources,是编写健壮、可维护 Java I/O 代码的基石。
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()
} catch (IOException e) {
System.err.println("写入文件 " + filename + " 时出错: " + e.getMessage());
// 建议记录日志或按需处理异常
}
}