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
相关产品推荐
相关产品推荐

