Try With Resources
你有没有被「忘记关闭流」这个问题坑过?文件锁释放不了,排查半天发现是 close 忘了写。try-with-resources 就是来解决这个的。
基本语法
JDK 7 引入的自动资源关闭语法。只要资源实现了 AutoCloseable 接口,就能在离开 try 块时自动关闭:
java
public class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("资源关闭");
}
}java
public class TryWithResourcesDemo {
public static void main(String[] args) {
// 自动关闭资源
try (BufferedReader reader = new BufferedReader(
new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 资源自动关闭
}
}多个资源
多个资源用分号分隔,关闭顺序是声明的相反顺序(先开后关):
java
public class MultipleResourcesDemo {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("in.txt");
FileOutputStream fos = new FileOutputStream("out.txt")) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}自定义资源
只要实现 AutoCloseable,任何资源都能自动关闭:
java
public class CustomResourceDemo {
static class DatabaseConnection implements AutoCloseable {
public void query(String sql) {
System.out.println("执行: " + sql);
}
@Override
public void close() {
System.out.println("关闭数据库连接");
}
}
public static void main(String[] args) {
try (DatabaseConnection db = new DatabaseConnection()) {
db.query("SELECT * FROM users");
} catch (Exception e) {
e.printStackTrace();
}
}
}关闭顺序
出异常后,即使 catch 中也抛出异常,finally 仍然会执行。资源按声明的相反顺序关闭。
