嵌套groovy withCloseable()

1yjd4xko  于 2023-08-02  发布在  其他
关注(0)|答案(1)|浏览(113)

我举个例子:

def fileLocation = '/path/to/my/file.txt'

new FileReader(fileLocation).withCloseable { fileReader ->
   new BufferedReader(fileReader).withCloseable{ resource ->
      doSomethingWithResource resource
   }
}

字符串
有没有什么方法可以更紧凑地实现这一点,即没有嵌套withCloseable() s?假设我需要三个流:我必须嵌套3个withCloseable(),等等。
这个例子不起作用:

new BufferedReader(new FileReader(fileLocation)).withCloseable{ resource ->
   doSomethingWithResource resource
}


如果外部流中存在异常,则内部流将不会被关闭。
请注意,我可以对这个过于简化的示例执行以下操作:

new File(fileLocation).newReader().withCloseable{ resource ->
   doSomethingWithResource resource
}


但这在我们确实需要嵌套流的情况下将不起作用。在groovy中实现这一点的最佳方法是什么?

icnyk63a

icnyk63a1#

Java的try-with-resources也在Groovy版本3中。
你的榜样会成为

def fileLocation = '/path/to/my/file.txt'

try ( fileReader = new FileReader(fileLocation)
    bufferedReader = new BufferedReader(fileReader)
) {
    doSomethingWithResource bufferedReader
}

字符串
实际上,如果在try-with-resources中有多个语句,编译器将为每个语句生成嵌套的try-finally块。
关闭BufferedReader将关闭底层FileReader(参见1388602)。但是在BufferedReader构造函数因异常而失败的情况下,FileReader不会被关闭。所以如果你照你说的做的话会有资源泄露的危险

// RISKY! use try-with-resources instead!
new BufferedReader(new FileReader(fileLocation)).withCloseable{
   resource -> doSomethingWithResource resource
}

相关问题