You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java try-with语句中嵌套的Closeable资源是否都会自动关闭?

try-with-resources未声明内层资源是否会自动关闭?

示例代码

try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("c:\\hello.txt"))));)
{
    writer.write("Hello");
    writer.flush();
}

问题

FileOutputStream、OutputStreamWriter和BufferedWriter均为Closeable资源,但未在try-with语句中单独声明为变量。请问Java执行该代码后会自动关闭所有这些资源,还是仅关闭BufferedWriter对象?

解答

结论:所有资源都会被自动关闭

虽然只在try-with语句里声明了最外层的BufferedWriter变量,但Java IO流基于装饰器模式的设计逻辑决定:外层流的close()方法会自动触发内层被包装流的close()调用。具体执行顺序是:

  • 当try-with-resources机制调用BufferedWriter的close()时,它会先调用内部OutputStreamWriter的close()
  • OutputStreamWriter执行close()时,又会调用它包裹的FileOutputStream的close()

同时,try-with-resources的异常处理机制会兜底:哪怕关闭过程中某一步抛出异常,剩余的资源仍会被尝试关闭,后续异常会被抑制并附属于第一个异常,不会出现资源泄漏的情况。

简言之,只要最外层的Closeable资源被纳入try-with-resources管理,整个包装链条里的所有资源都会被自动关闭,无需单独声明每个内层变量。

内容的提问来源于stack exchange,提问作者user3009097

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:42:01