try-with-resources 是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源。
传统写法:try-catch-finally
java
public static void main(String[] args) {
BufferedInputStream bin = null;
BufferedOutputStream bout = null;
try {
bin = new BufferedInputStream(new FileInputStream(new File("")));
bout = new BufferedOutputStream(new FileOutputStream(new File("")));
while ((b = bin.read()) != -1) {
bout.write(b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bin != null) {
try {
bin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
JDK 7:try-with-resources
java
public static void main(String[] args) {
try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File("")));
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File("")))) {
while ((b = bin.read()) != -1) {
bout.write(b);
}
} catch (Exception e) {
e.printStackTrace();
}
}
JDK 9:
try-with-resources 声明在 JDK 9 已得到改进。如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。
java
public static void main(String[] args) throws Exception {
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File("")));
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File("")));
try (bin;bout) {
while ((b = bin.read()) != -1) {
bout.write(b);
}
} catch (Exception e) {
e.printStackTrace();
}
}
资源必须实现 AutoClosable 接口,并重写 close 方法
java
public class Connection implements AutoCloseable {
@Override
public void close(){
}
}