jdk1.7 引入了资源自动关闭的AutoCloseable接口。
从AutoCloseable的注释可知它的出现是为了更好的管理资源,准确说是资源的释放。当一个资源类实现了该接口close方法,在使用try-catch-resources语法创建的资源抛出异常后,JVM会自动调用close 方法进行资源释放,当没有抛出异常正常退出try-block时候也会调用close方法。像数据库链接类Connection,IO类InputStream或OutputStream都直接或者间接实现了该接口。
使用的时候只需要把资源创建在try块中,用小括号括起来就可以了。
如:FileReader(extends)——>InputStreamReader(extends)——>Reader
public abstract class Reader implements Readable, Closeable {}
public interface Closeable extends AutoCloseable {}
InputStreamReader类实现了close()接口,在此方法中做了关闭资源的操作
public class InputStreamReader extends Reader {
//省略其他代码...
public void close() throws IOException {
sd.close();
}
}
使用示例:
public static void main(String[] args) {
try (
FileReader reader = new FileReader("D:/test.txt");
FileWriter writer = new FileWriter("D:/out.txt");
) {
int read = reader.read();
while (read != -1) {
writer.write(read);
read = reader.read();
}
} catch (Exception e) {
e.printStackTrace();
}
}
如果不使用AutoCloseable接口的资源管理方式:
如上代码创建了两个资源,在try-catch-finally的finally里面进行手动进行资源释放,释放时候还需要进行catch掉异常。
对比前后两种操作,显然实现AutoCloseable接口可以让代码变得更加简洁。
AutoCloseable接口使用总结:
- 使用try-catch-resources结构无论是否抛出异常在try-block执行完毕后都会调用资源的close方法。
- 使用try-catch-resources结构创建多个资源,try-block执行完毕后调用的close方法的顺序与创建资源顺序相反
- 使用try-catch-resources结构,try-block块抛出异常后先执行所有资源(try的()中声明的)的close方法然后在执行catch里面的代码然后才是finally
- 只用在try的()中声明的资源的close方法才会被调用,并且当对象销毁的时候close也不会被调用
- 使用try-catch-resources结构,无须显示调用资源释放
参考阅读: