在Java 6中模拟try-with-resources的最佳方法是什么?

Zhe*_*lov 9 java try-with-resources

事实证明,几乎没有人正确地关闭Java中的资源.程序员要么不使用try-finally块可言,或只是把resource.close()finally,这也是不正确的(因为Throwableclose()可影子Throwable从try块).有时他们把类似的东西IOUtils.closeQuietly()只是正确的InputStream,但不是OutputStream.try-with-resources解决了所有这些问题,但仍有大量的项目用Java 6编写.

try-with-resources在Java 6中模拟的最佳方法是什么?现在我使用的是Guava Closer,它比什么都好,但仍然比它更糟糕try-with-resources.此外,还有一种称为贷款模式的模式,但Java中缺少lambdas使得这种模式非常麻烦.有没有更好的办法?

Zhe*_*lov 3

我找到了一个很好的替代品try-with-resources。它使用Lombok库进行注释处理:

 @Cleanup InputStream in = new FileInputStream(args[0]);
 @Cleanup OutputStream out = new FileOutputStream(args[1]);
 byte[] b = new byte[10000];
 while (true) {
   int r = in.read(b);
   if (r == -1) break;
   out.write(b, 0, r);
 }
Run Code Online (Sandbox Code Playgroud)

但是,它不能正确处理异常。该错误已经存在 1 年多了,但仍未关闭:https://code.google.com/p/projectlombok/issues/detail?id=384