java的try-with-resources可自动关闭printwriter等autocloseable资源,只需将其声明在try括号内,jvm会在块结束时调用close(),连带关闭底层流,无需手动关闭且异常时仍保障关闭。

Java 的 try-with-resources 语句能自动关闭实现了 AutoCloseable 接口的资源,包括字符打印流(如 PrintWriter、PrintStream)。关键在于:只要把流声明在 try 括号内,JVM 就会在 try 块结束(无论是否异常)时自动调用其 close() 方法。
确保流是可自动关闭的
PrintWriter 和 PrintStream 都实现了 AutoCloseable,因此可直接用于 try-with-resources。但要注意:它们的底层包装流(如 FileWriter、OutputStream)也必须是可关闭的,且不能提前手动关闭。
- ✅ 正确:将
PrintWriter直接声明在 try 括号中,它会连带关闭其内部的Writer - ❌ 错误:先创建
FileWriter,再传给PrintWriter,却只把PrintWriter放入 try,而没让FileWriter参与资源管理(其实没问题,因为PrintWriter.close()会转发关闭到底层) - ⚠️ 注意:如果构造
PrintWriter时传入了autoFlush = true,不影响关闭行为;关闭仍会刷新缓冲区并释放资源
典型写法示例
向文件写入字符串并安全关闭:
try (PrintWriter pw = new PrintWriter("output.txt", "UTF-8")) {
pw.println("Hello, try-with-resources!");
pw.printf("Current time: %s%n", LocalDateTime.now());
} catch (IOException e) {
System.err.println("写入失败:" + e.getMessage());
}
这段代码中,PrintWriter 在 try 结束时自动关闭,无需显式调用 pw.close(),也不会因忘记关闭导致文件句柄泄漏。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
处理多层包装流(推荐显式管理最外层)
若使用带缓冲的打印流(例如 PrintWriter → BufferedWriter → FileWriter),只需将最外层的 PrintWriter 置于 try 括号中即可。它的 close() 方法会逐级调用内部流的 close()。
- 例如:
new PrintWriter(new BufferedWriter(new FileWriter("a.txt")))—— 只需管理PrintWriter - 不建议把多个流都写进 try 括号(如同时声明
FileWriter和PrintWriter),容易引发重复关闭或编译错误
异常情况下的关闭保障
即使 try 块中抛出异常,try-with-resources 仍会执行关闭逻辑。若关闭过程本身也抛出异常(如磁盘满导致 close() 失败),该异常会被抑制(suppressed),主异常仍被抛出,可通过 Throwable.getSuppressed() 获取。
日常开发中无需主动处理抑制异常,除非有特殊审计或日志需求。默认行为已足够健壮。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










