【问题标题】:try-with-resources Statement in Java SE 7 and laterJava SE 7 及更高版本中的 try-with-resources 语句
【发布时间】:2015-12-29 00:13:21
【问题描述】:

我正在使用 Java SDK8,并创建了一个 inputStream 和 outputStream 对象。

在 Java SE 7 之前,我可以使用 finally 块来确保关闭这些资源,而不管 try 语句是否正常完成。 我在 Java SE 7 中读到过,后来我可以使用 try-with-resources 语句,如果我使用的资源实现了接口 java.lang.AutoCloseable 我不需要在 finally 块中关闭这个资源更多。

我的问题是: 1.如果我使用实现接口java.lang.AutoCloseable的资源我不需要在finally块中关闭它并且即使抛出异常也会关闭它是否正确?如果是这样,是否存在必须存在的先决条件? (例如,在 try 块中创建资源?)
2. try-with-resources 语句究竟是什么意思?

提前非常感谢!

【问题讨论】:

标签: java io try-with-resources


【解决方案1】:
  1. 如果我使用实现接口 java.lang.AutoCloseable 的资源我不需要在 finally 块中关闭它并且即使抛出异常也会关闭它是否正确?李>

是的。

如果是这样,是否存在必须存在的先决条件? (例如,在 try 块中创建资源?)

资源必须在 try-with-resources 语句中创建(见下文)。

  1. 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());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2012-03-04
    • 2013-06-30
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多