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

Java BufferedWriter的close未显式调用out.close() 底层流如何关闭

BufferedWriter底层流关闭逻辑说明

你看到的out.close()没有显式写在代码里,是因为Java 7引入的try-with-resources语法已经自动实现了这个调用:

  • 所有实现了AutoCloseable接口的类(Closeable接口继承自AutoCloseable,所有Java IO流类都实现了Closeable),只要在try后的括号中声明为资源,就会在try代码块执行完成后(无论正常结束还是抛出异常),自动调用其close()方法。

我们逐行拆解这段close()方法的执行流程:

  1. 先加锁判断当前out是否已经为null,如果是直接返回,避免重复关闭
  2. try (Writer w = out)将底层输出流声明为try-with-resources的托管资源
  3. 执行try块内的flushBuffer(),把BufferedWriter自身缓存的未写出字符全部刷到底层out流中
  4. try块执行结束后,语法自动触发w.close()也就是底层out的close()方法,嵌套在out内的所有流会按照Closeable接口的约定依次关闭
  5. 最后finally块把out和内部缓存数组cb置为null,释放引用避免内存泄漏,同时防止后续重复执行关闭逻辑

这种写法比手动写out.close()更安全:如果flushBuffer()执行时抛出异常,try-with-resources仍然能保证底层流被正常关闭,同时如果close()执行也抛出异常,会自动将flushBuffer()的异常设为主异常,close()的异常标记为抑制异常,符合IO流关闭的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:36:08