在jdk1.7的时候提供了一个自动资源关闭的接口,叫AutoCloseable。资源代表的有很多,例如、IO资源,网络资源,数据库资源等等。为什么叫自动资源关闭,例如我们用IO流读取一个文件,之前的写法是
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class OldIO {
public static void main(String[] args) {
File file = new File("D:/test.txt");
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader(file));
String txtLine = null;
while ((txtLine = bufferedReader.readLine()) != null){
System.out.println(txtLine);
}
bufferedReader.close();//关闭资源
}catch (Exception e){
}finally {
if (bufferedReader != null){ //代码执行完,如果资源没释放,则需要关闭资源
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
可见在正常读取完毕,需要关闭资源,为了防止读取过程中抛出异常,则需要再finally块中判断资源是否关闭,然后再去关闭资源。
所以在JDK1.7的时候就提出了一种自动关闭资源的想法,所以AutoCloseable接口就诞生了,查看AutoCloseable源码会发现,接口只有一个方法close()
package java.lang;
public interface AutoCloseable {
void close() throws Exception;
}
并且接口属于java.lang包属于lang包的一个基础类库。查看官方文档,可以发现茫茫多的接口、类或继承或实现了该接口。当然上面的BufferedReader这个类也实现了AutoCloseable接口,但是关闭资源的写法要注意,新的写法是这样的:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class AutoCloseIO {
public static void main(String[] args) {
File file = new File("D:/test.txt");
//AutoCloseable的写法,try(资源){}catch{}
try(BufferedReader bufferedReader = new BufferedReader(new FileReader(file))){
String txtLine = null;
while ((txtLine = bufferedReader.readLine()) != null){
System.out.println(txtLine);
}
}catch (Exception e){
}
}
}
是不是优雅了很多呢?
所有实现了AutoCloseable的类都可以这么写,当然也可以写一个类实现AutoCloseable,但是AutoCloseable只是一个接口,提供了这种关闭资源的途径,所以close()方法必须实现,而在资源colse的时候一定要考虑周全,一般新手不建议自己手写AutoCloseable。
网友评论