- 如果我使用实现接口 java.lang.AutoCloseable 的资源我不需要在 finally 块中关闭它并且即使抛出异常也会关闭它是否正确?李>
是的。
如果是这样,是否存在必须存在的先决条件? (例如,在 try 块中创建资源?)
资源必须在 try-with-resources 语句中创建(见下文)。
- try-with-resources 语句究竟是什么意思?
这是一个 try-with-resources 语句:
try (FileReader fr = FileReader(path)) {
// use fr here
}
注意FileReader 的初始化是如何在try(在新的() 部分)。这就是语句如何知道以后需要关闭的内容。
(更多在the tutorial,虽然我不喜欢他们的第一个示例,因为它依赖于A)BufferedReader 构造函数从不抛出的事实,以及B)BufferedReader 将关闭@987654329 的事实@BufferedReader 关闭时。 BufferedReader 是这样,但在一般情况下这是一个糟糕的例子。)
完整的细节,包括 try-with-resources 在旧 try/catch/finally 格式中的翻译,都在 the specification 中。
注意,可以在语句中创建多个资源;它们以相反的创建顺序关闭:
try (
FileReader fr =
new FileReader(fileName);
NiftyThingUsingReader nifty =
new NiftyThingUsingReader(fr)
) {
// ...use `nifty` here
}
虽然你可以写:
try (
NiftyThingUsingReader nifty =
new NiftyThingUsingReader(new FileReader(fileName))
) {
// ...use `nifty` here
}
...您必须确定知道NiftyThingUsingReader(FileReader) 永远不会引发异常,并且NiftyThingUsingReader#close 将关闭底层FileReader,因为它不会 由 try-with-resources 本身处理。如果您不确定,请将它们分开,以便 try-with-resources 语句关闭 FileReader,即使 NiftyThingUsingReader(FileReader) 构造函数抛出,即使 NiftyThingUsingReader#close 没有关闭它。
资源不必(直接)相互依赖;例如,这是一种相当常见的情况,您希望同时处理输入和输出:
try (
java.util.zip.ZipFile zf =
new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer =
java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
// Enumerate each entry
for (java.util.Enumeration entries =
zf.entries(); entries.hasMoreElements();) {
// Get the entry name and write it to the output file
String newLine = System.getProperty("line.separator");
String zipEntryName =
((java.util.zip.ZipEntry)entries.nextElement()).getName() +
newLine;
writer.write(zipEntryName, 0, zipEntryName.length());
}
}