还在使用try-catch-finally么,过时了!
还在使用try-catch-finally么,过时了!
在Effective Java一书中有这么一条,try-with-resource优先于try—finally。那么try-with-resource到底是什么东西呢?
Java类库中存在许多必须用close方法来手动关闭的资源(InputStream、OutputStream等),以往我们常常认为try—finally是关闭这些资源的最佳方法,但是如果我们需要关闭的资源变多了,你的代码似乎看起来就没有那么整洁了。
下面举个小例子:
public void finaly(String path){
System.out.println("start");
BufferedInputStream bin = null;
BufferedOutputStream bout = null;
try {
bin = new BufferedInputStream(new FileInputStream(new File(path)));
bout = new BufferedOutputStream(new FileOutputStream(new File(path)));
int b;
while ((b = bin.read()) != -1) {
bout.write(b);
}
}catch (FileNotFoundException e) {
e.getMessage();
} catch (IOException e){
e.getMessage();
} finally {
try{
bin.close(); //关闭bin流,但有可能抛出异常
}catch (IOException e){
e.getMessage();
}finally {
try {
bout.close(); // 关闭bout流
} catch (IOException e) {
e.getMessage();
}
}
}
System.out.println("end");
}
还好在Java7给我们提供了对于这类问题的一个更好的解决方案:
public void resource(String path){
System.out.println("start");
File f = new File(path);
try(
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(f));
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(f))
){
int b;
while ((b = bin.read()) != -1) {
bout.write(b);
}
}catch (IOException e) {
e.getMessage();
}
System.out.println("end");
}
但是切记!!!在使用这个语法糖时,请确保被构造的资源(也就是try后边括号中的对象),已经实现了Closeable或者AutoCloseable接口(Java和许多第三方类库现在已经实现或者扩展了这个接口)。
PS:如果你自己编写了一个类,它必须被关闭,那你也应该让你写的这个类实现这个接口。