使用“自动关闭”关闭多个资源(试用资源)

我知道您通过尝试传递的资源将自动关闭,如果该资源已实现自动关闭。目前为止,一切都好。但是,当我有几个想要自动关闭的资源时,我该怎么办。套接字示例;

try (Socket socket = new Socket()) {
    input = new DataInputStream(socket.getInputStream());
    output = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
} 

所以我知道套接字会被正确关闭,因为它在try中作为参数传递,但是输入和输出应该如何正确关闭呢?


答案 1

“试用资源”可以用于多个资源,方法是在括号中声明所有资源。查看文档

链接文档中的相关代码摘录:

public static void writeToFileZipFileContents(String zipFileName,
                                           String outputFileName)
                                           throws java.io.IOException {

    java.nio.charset.Charset charset =
         java.nio.charset.StandardCharsets.US_ASCII;
    java.nio.file.Path outputFilePath =
         java.nio.file.Paths.get(outputFileName);

    // Open zip file and create output file with 
    // try-with-resources statement

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

如果你的对象没有实现(do),或者必须在 try-with-resources 之前声明,那么关闭它们的适当位置是在一个块中,链接的文档中也提到了这一点。AutoClosableDataInputStreamfinally


答案 2

别担心,事情会“就这样”从 Socket 的文档

关闭此套接字也会关闭套接字的输入流和输出流。

我理解你对没有显式调用输入和输出对象的担忧,事实上,通常最好确保所有资源都由块自动管理,如下所示:close()try-with-resources

try (Socket socket = new Socket();
     InputStream input = new DataInputStream(socket.getInputStream());
     OutputStream output = new DataOutputStream(socket.getOutputStream());) {
} catch (IOException e) {
} 

这将产生 socket 对象将被“多次关闭”的效果,但这不应该造成任何伤害(这是通常建议将所有实现都设置为幂等的原因之一)。close()


推荐