Appearance
传统的资源关闭方法,需要我们使用if加上try……cache语句,那么有没有更加优雅的资源关闭方法呢,使我们的代码看上去更精简,而不是一坨的摆在哪里。
传统的资源关闭写法
先来体验一下传统的资源关闭方式,注意 finally
类中的代码,其繁琐程度大家体验一下
java
@Test
public void copyFile() {
// 定义输入路径和输出路径
String originalUrl = "lib/FileCopyTest.java";
String targetUrl = "targetTest/target.txt";
// 声明文件输入流,文件输出流
FileInputStream originalFileInputStream = null;
FileOutputStream targetFileOutputStream = null;
try {
// 实例化文件流对象
originalFileInputStream = new FileInputStream(originalUrl);
targetFileOutputStream = new FileOutputStream(targetUrl);
// 读取的字节信息
int content;
// 迭代,读取/写入字节
while ((content = originalFileInputStream.read()) != -1) {
targetFileOutputStream.write(content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流资源
if (targetFileOutputStream != null) {
try {
targetFileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (originalFileInputStream != null) {
try {
originalFileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TWR方式优化资源关闭
TWR
是简写,全称是 try-with-resource
,直接上代码体会一下
java
@Test
public void copyFile2() {
// 先定义输入/输出路径
String originalUrl = "lib/NewFileCopyTest.java";
String targetUrl = "targetTest/new.txt";
// 初始化输入/输出流对象
try (
FileInputStream originalFileInputStream = new FileInputStream(originalUrl);
FileOutputStream targetFileOutputStream = new FileOutputStream(targetUrl);
) {
int content;
// 迭代,拷贝数据
while ((content = originalFileInputStream.read()) != -1) {
targetFileOutputStream.write(content);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
解析: 在 try()
中定义的资源不需要关闭,jdk
自动帮我们处理了
注意:这种写法 jdk7
才开始支持,不会有执行效率上的提升,是 jdk
的语法糖,简化开发代码的。