没有TWR时:
在java 7之前,一般在进行文件IO操作时都需要显式的进行文件流(也可以理解为资源)的close操作,无论是操作到文件流末尾还是发生异常。往往很简单的一个逻辑都要好几行的代码进行修饰,使得代码结构变的复杂。
public class FileCopyTest {
@Test
public void testCopy() {
//声明输入输出路径
String originalUrl = "lib_1/FileCopyTest.java";
String targetUrl = "lib_2/demo.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时 —— try…with…resource
public class FileCopyTestNew {
@Test
public void testCopy() {
String originalUrl = "lib_1/FileCopyTestNew.java";
String targetUrl = "lib_2/demo2.txt";
try (
FileInputStream inputStream = new FileInputStream(originalUrl);
FileOutputStream outputStream = new FileOutputStream(targetUrl);
) {
int content;
while ((content = inputStream.read()) != -1){
outputStream.write(content);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
try-with-resources语句是声明了一个或多个资源的try语句块。在java中资源作为一个对象,在程序完成后必须关闭。try-with-resources语句确保每个资源在语句结束时关闭。只要是实现了java.lang.AutoCloseable的任何对象(包括实现java.lang.Closeable的所有对象)都可以使用该方式对资源进行关闭。
看一下FileCopyTestNew 中,
FileInputStream extends InputStream
InputStream implements Closeable
Closeable extends AutoCloseable
闭环了。