closeQuietly()的使用
我想用过IOUtils.closeQuietly(out)的人都会对它爱不释手,因为它大大简化了流的关闭操作。
使用前:
finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
xxxxxx
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
xxxxxx
}
}
}
使用后:
finally {
IOUtils.closeQuietly(out);
}
这真的让人看着舒服了很多。
但是在2.6版本的时候,它过时了……
过时原因的个人见解
我发现在2.5版本及其使用Java6时还是有效的,而在2.6时,它才发生了改变,这时它已经用起了Java7。后来我也在StackOverflow上找到了原因:
出错时,忽略异常
public static void closeQuietly(Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (IOException var2) {
;
}
}
其实它也不是不安全,毕竟处理流的过程中出错了话,已经有其他try catch包围了,closeQuietly()只是确保流会被关闭,无论流是否正常结束。
try-with-resource的出现
那么为什么会在2.6的时候将它标记为过时呢?因为Java7里的“try-with-resource”语法的出现。
使用方式:
try (
ByteArrayOutputStream out = new ByteArrayOutputStream();
) {
// Do something
} finally {
}
之前定义在try catch外部的流移到了try后边的括号里,然后finally里就不再需要手动关闭了,它会自行处理。
怎么处理呢?看它编译后的模样:
ByteArrayOutputStream out = new ByteArrayOutputStream();
Throwable var10 = null;
byte[] resultDatas;
try {
// Do something
} catch (Throwable var20) {
var10 = var20;
throw var20;
} finally {
if (out != null) {
if (var10 != null) {
try {
out.close();
} catch (Throwable var19) {
var10.addSuppressed(var19);
}
} else {
out.close();
}
}
}
所以“try-with-resource”就是所谓的语法糖,帮我们省事了而已。
结论:用try-with-resource代替IOUtils.closeQuietly(out)
所以官方还是建议大家多使用“try-with-resource”,不过在这里给大家避个坑
使用“try-with-resource”后,无法再进行赋值操作
image.png可知,在try()内定义的流相当于加了final标记,你无法再改变其内存引用地址。
网友评论