从版本 7 开始,Java 提供了改进的资源管理,这些资源在使用完后应关闭。此类资源包括文件、流、数据库连接和套接字等。这个目的是通过一种特殊的语言结构 try-with-resources 来实现的。为了使这种自动关闭功能发挥作用,创建了一个特殊的界面
AutoCloseable
。 在 Java 7 中,所有资源类都实现该接口。它的签名如下所示:
public interface AutoCloseable {
void close() throws Exception;
}
该接口声明了一个方法,close()
该方法会在构造所服务的对象上自动调用try-with-resources
。尽管 Java 7 中的资源类实现了此接口,但您使用的许多库并未实现此接口,这要么是因为库尚未更新为与 AutoCloseable 接口一起使用,要么是您根本没有能力更新库。在大多数情况下,这可以很容易地解决。继承应该参与的资源类try-with-resources
。让我们举个例子ITextRenderer
(来自飞碟项目)。完成工作后ITextRenderer
,应调用该方法finishPDF()
。通常您会在一个块中执行此操作finally
。但是,当您创建一个扩展ITextRenderer
并实现该接口的新类时AutoCloseable
,您可以将其包含在try-with-resources
. 新类AutoCloseableITextRenderer
将如下所示:
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
@Override
public void close() {
super.finishPDF();
}
}
在后代中扩展原始类是最合理的解决方案,因为新类仍然是ITextRenderer
. 如果原始类声明为final
,则必须使用组合。这就是用法:
try (final AutoCloseableITextRenderer iTextRenderer = new AutoCloseableITextRenderer()) {
ByteArrayOutputStream out; // contains the data to be converted to PDF, not shown here.
iTextRenderer.setDocumentFromString(new String(out.toByteArray()));
iTextRenderer.layout();
iTextRenderer.createPDF(pdfOutputStream);
pdfOutputStream.flush();
}
就这样。请注意,我没有close()
从AutoCloseableITextRenderer
. 接口的JavadocAutoCloseable
对此有如下说明:虽然接口方法被声明为抛出异常Exception
,但强烈建议该方法的实现者在实现该方法时使用更具体的异常类,或者如果该方法不能抛出异常,则根本不抛出close()
异常失败。
GO TO FULL VERSION