Java BufferedWriter的close未显式调用out.close() 底层流如何关闭
BufferedWriter底层流关闭逻辑说明
你看到的out.close()没有显式写在代码里,是因为Java 7引入的try-with-resources语法已经自动实现了这个调用:
- 所有实现了
AutoCloseable接口的类(Closeable接口继承自AutoCloseable,所有Java IO流类都实现了Closeable),只要在try后的括号中声明为资源,就会在try代码块执行完成后(无论正常结束还是抛出异常),自动调用其close()方法。
我们逐行拆解这段close()方法的执行流程:
- 先加锁判断当前
out是否已经为null,如果是直接返回,避免重复关闭 try (Writer w = out)将底层输出流声明为try-with-resources的托管资源- 执行
try块内的flushBuffer(),把BufferedWriter自身缓存的未写出字符全部刷到底层out流中 try块执行结束后,语法自动触发w.close()也就是底层out的close()方法,嵌套在out内的所有流会按照Closeable接口的约定依次关闭- 最后
finally块把out和内部缓存数组cb置为null,释放引用避免内存泄漏,同时防止后续重复执行关闭逻辑
这种写法比手动写out.close()更安全:如果flushBuffer()执行时抛出异常,try-with-resources仍然能保证底层流被正常关闭,同时如果close()执行也抛出异常,会自动将flushBuffer()的异常设为主异常,close()的异常标记为抑制异常,符合IO流关闭的最佳实践。
内容的提问来源于stack exchange,提问作者Comencau
相关产品推荐
相关产品推荐

