基本语法
try(…) {} ,try里面所有实现接口java.lang.AutoCloseable,包括java.io.Closeable的对象,在{}的语句块执行完毕后都会自动的close。
例如:
try (FileWriter fileWriter = new FileWriter(outFile);
PrintWriter printWriter = new PrintWriter(fileWriter)) {
for (int i = 0; i < template.length; i++) {
printWriter.println(template[i]);
}
} catch (IOException e) {
LOGGER.error("写出小说文件失败,文件路径:{}", filePath);
}
- fileWriter和printWriter都会在try的{}里面语句执行完后自动执行clone();
- try结束后自动调用的close方法,这个动作会早于finally里调用的方法。
- 不管是否出现异常,try()里的实例都会被调用close方法
- 越晚声明的对象,会越早被close掉。
guava给我们提供了方法。我们可以把Closeable 的对象注册到Closer对象上,资源使用完毕后,调用closer的close方法,就可以把所有注册了的资源安全的close掉。这个方法虽然没有try-with-resources好用,但是比起传统的jdk做法,要好很多了。
Closer closer = Closer.create();
try {
InputStream in = closer.register(openInputStream());
OutputStream out = closer.register(openOutputStream());
// do stuff with in and out
} catch (Throwable e) { // must catch Throwable
throw closer.rethrow(e);
} finally {
closer.close();
}