try-with-resource优雅关闭资源
一、介绍
1、java7引入的新特性
2、优雅关闭资源
3、一种Java语法糖
二、使用
在JDK7之前的时候,关闭流资源需要在finally块中手动关闭。
在JDK7引入了一个新特性try-with-resource,我们只需要在try()的括号里声明使用的流资源,而不需要自己在finally中关闭资源。
@Test
public void testCloseResource() {
String originalUrl = "D:\\WorkSpace\\old.txt";
String targetUrl = "D:\\WorkSpace\\new.txt";
try (
FileInputStream fileInputStream = new FileInputStream(originalUrl);
FileOutputStream fileOutputStream = new FileOutputStream(targetUrl);
) {
byte[] bytes = new byte[1024];
int len;
while ((len = fileInputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
可以通过反编译查看反编译后的代码,可以发现已经实现了资源关闭。(反编译工具: JD-GUI、Jad 等,我这里直接使用IDEA查看的)
@Test
public void testCloseResource() {
String originalUrl = "D:\\WorkSpace\\old.txt";
String targetUrl = "D:\\WorkSpace\\new.txt";
try {
FileInputStream fileInputStream = new FileInputStream(originalUrl);
Throwable var4 = null;
try {
FileOutputStream fileOutputStream = new FileOutputStream(targetUrl);
Throwable var6 = null;
try {
byte[] bytes = new byte[1024];
int len;
while((len = fileInputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
} catch (Throwable var34) {
var6 = var34;
throw var34;
} finally {
if (fileOutputStream != null) {
if (var6 != null) {
try {
fileOutputStream.close();
} catch (Throwable var33) {
var6.addSuppressed(var33);
}
} else {
fileOutputStream.close();
}
}
}
} catch (Throwable var36) {
var4 = var36;
throw var36;
} finally {
if (fileInputStream != null) {
if (var4 != null) {
try {
fileInputStream.close();
} catch (Throwable var32) {
var4.addSuppressed(var32);
}
} else {
fileInputStream.close();
}
}
}
} catch (FileNotFoundException var38) {
var38.printStackTrace();
} catch (IOException var39) {
var39.printStackTrace();
}
}
三、注意点
1、只有实现了AutoCloseable接口,TWR才可以实现多资源自动关闭。
2、TWR避免异常屏蔽:将底层的异常追加到最外层的异常上。
3、ByteArrayInputStream等不需要检查关闭的资源对象。
4、使用Socket获取的InputStream和OutputStream对象不需要关闭(Socket关闭了,流就关闭了)。