版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
背景: JDK-7
一、在finally最后关闭(普通)
在try-catch-finally最后按照声明对象的逆顺序关闭流对象:
finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
//错误处理
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
//错误处理
}
}
}
注意事项:
1. 在关闭流对象的时候需要加上try-catch语句,防止close语句报错。
2. 对于多个流对象,需要使用相同个数的try-catch依次关闭。倘若所有流都在同一个try语句中关闭,那么当第一个流对象关闭报错时,系统会跳过往下的关闭语句,而执行catch语句。
finally {
try {
if (in != null) {
in.close(); //当in.close()发生错误时,out.close()将被跳过,因此此处需要再加上try-catch语句
}
if (out != null) {
out.close();
}
}catch (IOException e) {
//错误处理
}
}
二、 在finally中使用IOUtils.closeQuietly()方法关闭
1. IOUtils类提供了closeQuietly方法去关闭相应的流对象,其内部实现就是第一种方法
public static void closeQuietly(Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (IOException var2) {
//ignore;
}
}
2. 该方法虽然可以替换第一种方法,少写许多代码,但是捕获到的异常都会被忽略。因此该方法需要慎重使用。
三、 try-with-resource 语法糖
例子:
try (
ByteArrayOutputStream out = new ByteArrayOutputStream();
... //其他流对象
...
) { // try此处是()括号而非花括号
// Do something
} finally {
}
1. try()中可以声明多个流对象,无论运行是否出错,最终都会按照声明的逆顺序依次关闭。
2. try()中只能声明实现了AutoCloseable接口的流对象,否则报错。
3. 该方法的缺点是,倘若有两个流对象A,B,对象B是通过File获取的流对象,此时File对象因为没有实现AutoCloseable接口从而无法放入try()。所以,使用 try-with-resource 语法糖 除了要满足第二条的条件外,对于流对象间互相依赖也有限制。
总结:
一般情况,try-with-resource 语法糖能够节省许多代码,而对于IOUtils.closeQuietly()方法和普通try-catch的选用,需要依照实际情况选择,例如有多个流对象需要关闭,那么选用IOUtils.closeQuietly(),倘若要对流对象关闭时的异常进行相关的处理,那么还是使用普通的方式较好。