groovy通过withcloseable方法自动管理closeable资源,确保闭包执行后无论是否异常均调用close(),语法简洁且语义等价于java try-with-resources,支持链式嵌套与独立关闭。

Groovy 没有直接的 try-with-resources 语法,但提供了更简洁、惯用的方式自动管理 Closeable 资源,核心是利用闭包和内置的 withCloseable 方法。
用 withCloseable 自动关闭 Closeable
Groovy 为所有实现了 java.io.Closeable(或 AutoCloseable)的类添加了 withCloseable 扩展方法。它会确保资源在闭包执行完毕后(无论是否异常)被调用 close()。
- 语法简单:直接在资源上调用
.withCloseable { ... } - 语义等价于 Java 的
try-with-resources:支持正常结束、异常退出、提前 return 等各种情况下的可靠关闭 - 适用于
FileInputStream、BufferedReader、Socket、Connection等常见 Closeable 类型
示例:
new FileInputStream("data.txt").withCloseable { fis ->
def data = fis.text
println "Read: $data"
} // fis.close() 自动调用
链式调用与嵌套资源
多个资源可嵌套使用 withCloseable,顺序与 Java 中的 try-with-resources 一致(内层先关,外层后关)。
- 避免手动嵌套导致的缩进过深,也可提取为独立变量提升可读性
- 每个资源独立保证关闭,不依赖外部 try/catch
示例(读取并写入):
new FileInputStream("input.txt").withCloseable { fis ->
new FileOutputStream("output.txt").withCloseable { fos ->
fos
配合 Groovy 的 I/O 辅助方法(更 Groovy 风格)
很多 Groovy 的 I/O 方法(如 File.withReader、File.withInputStream、Socket.withStreams)内部已封装了资源自动关闭逻辑,比裸调 withCloseable 更简洁。
-
new File("log.txt").withReader { it.readLine() }—— 自动关闭 Reader -
new URL("http://example.com").withInputStream { it.text }—— 自动关闭 InputStream - 这些方法本质也是基于
withCloseable实现,但语义更聚焦、代码更声明式
自定义类型支持 withCloseable
只要你的类实现 Closeable 或 AutoCloseable,Groovy 就能识别并支持 withCloseable;无需额外适配。
- 若类未实现接口但有
close()方法,可通过@CompileStatic+ 手动扩展,但不推荐——应优先遵循标准接口 - 第三方库中符合 Closeable 规范的类(如 Apache Commons 的
IOUtils.closeQuietly场景)可直接用withCloseable
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











