JavaRush /Java 博客 /Random-ZH /Java 7 尝试资源
DarthVictor
第 28 级

Java 7 尝试资源

已在 Random-ZH 群组中发布
从版本 7 开始,Java 提供了改进的资源管理,这些资源在使用完后应关闭。此类资源包括文件、流、数据库连接和套接字等。这个目的是通过一种特殊的语言结构 try-with-resources 来实现的。为了使这种自动关闭功能发挥作用,创建了一个特殊的界面AutoCloseableJava 7 尝试资源 - 1在 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()异常失败。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION