try-with-resources 是 Java 7 引入的一种特殊的 try 语句,允许在使用时,声明一个或多个资源。这些资源,会在 try-with-resources 语句结束时,自动被关闭。
在 try-with-resources 中使用的资源,必须实现 java.lang.AutoCloseable 接口。
try-with-resources 示例(引自 Java 文档):
static void readFile(String path) {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
br.readLine();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// Others
}
}
示例说明:
(1) 资源对象作用域:资源对象 br 的作用域为 try block 范围,即 try 的 { } 之间,在 catch 和 finally block 中无法访问该变量。
(2) 自动关闭:当 try block 中的代码运行完毕,资源对象 br 会被自动关闭,无需调用 br.close() 方法。
(3) 优先关闭:资源对象会在进入 catch 和 finally 之前被自动关闭。
在 Java 7 之前,为了保证资源对象在使用后被关闭,通常将关闭操作写在 finally block 中。但是,在 finally block 中,我们又需要 try catch 关闭方法的异常。
示例:
static void readFile(String path) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(path));
br.readLine();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
由此可见,使用 try-with-resources 语句,可以简化我们的代码,同时,保证了资源对象一定会被关闭。
在 try-with-resources 中,允许同时定义多个资源,各资源之间用分号“;”分隔。
示例:
try (
BufferedReader br = new BufferedReader(new FileReader(path));
BufferedWriter bw = Files.newBufferedWriter(outputFilePath)
) {
String str = br.readLine();
bw.write(str);
} catch (IOException e) {
e.printStackTrace();
}