
5.8 try-with-resources语句的详细用法
关于try-with-resources语句,在前面章节也做过介绍,最早是在Java 7中引入的。在Java 9中,又对try-with-resources进行了改进,使得用户可以更加方便、简洁地使用try-with-resources语句。
为了演示try-with-resources语句的好处,先来看一个在Java 7之前对于资源处理的例子。
5.8.1 手动关闭资源
在Java 7之前,资源需要手动关闭。下面是一个很常见的文件操作的例子:

在Java 7之前,一定要在finally中执行close,以释放资源。
5.8.2 Java 7中的try-with-resources介绍
try-with-resources是Java 7中一个新的异常处理机制,能够很容易地关闭在try-catch语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources语句确保了每个资源在语句结束时关闭。所有实现了java.lang.AutoCloseable接口(其中,它包括实现了java.io.Closeable的所有对象),可以使用作为资源。
例如,我们自定义一个资源类:

执行输出如下:
do something resource is closed
可以看到,资源终止被自动关闭了。
再来看一个例子,是同时关闭多个资源的情况:

最终输出为:
do something do other things other resource is closed some resource is closed
在try语句中越是最后使用的资源,越是最早被关闭。
5.8.3 try-with-resources在Java 9中的改进
作为JEP 213规范(http://openjdk.java.net/jeps/213)的一部分,try-with-resources声明在Java 9中已得到改进。如果已经有一个资源是final或等效于final的变量,则可以在try-with-resources语句中使用该变量,而无须在try-with-resources语句中声明一个新变量。
例如,给定资源的声明:

用老方法编写代码来管理这些资源是类似的:

而新方法可以是:

看上去简洁很多!