Java在Try-With语句中嵌入可关闭资源

nom7f22z  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(133)

这里有一个简单的代码。

try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("c:\\hello.txt"))));)
        {
            writer.write("Hello");
            writer.flush();
        }

所以基本上FileOutputStreamOutputStreamWriterBufferedWriter都是可关闭的资源。但是它们没有在try-with语句中显式声明为单独的变量。在这种情况下,Java会在执行后自动关闭所有这些资源还是只关闭BufferedWriter对象?

8xiog9wr

8xiog9wr1#

Java将关闭BufferedWriter,这意味着它将关闭它 Package 的每个流。您可以以不同的方式编写代码,如下所示:

try (FileOutputStream fos = new FileOutputStream(new File("c:\\hello.txt"));
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter writer = new BufferedWriter(osw)) {
    writer.write("Hello");
    writer.flush();
}

这不会改变 try-with-resources 语句的工作方式,但它可能更容易阅读和理解关闭的工作方式。
下面是编写上述代码的另一种方式,可能有助于说明流关闭(此示例仅用于说明目的)。

FileOutputStream fos = new FileOutputStream(new File("c:\\hello.txt"));
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos))) {
    writer.write("Hello");
    writer.flush();
}

在Java中,如果任何类被关闭,那么它们也会关闭底层流。在上面的例子中,BufferedWriter类 Package 在OutputStreamWriter周围,OutputStreamWriter Package 在FileOutputStream类周围。正如您所看到的,示例fos从未显式关闭,但它已经关闭,因为BufferedWriter已经被 try-with-resources 语句关闭。
java doc
try-with-resources语句是声明一个或多个资源的try语句。资源是在程序结束后必须关闭的对象。try-with-resources语句确保每个资源在语句结束时关闭。任何实现java.lang.AutoCloseable的对象,包括所有实现java.io.Closeable的对象,可以作为一种资源。
下面的示例从文件中读取第一行。它使用FileReaderBufferedReader的示例从文件中读取数据。FileReaderBufferedReader是程序完成后必须关闭的资源:

static String readFirstLineFromFile(String path) throws IOException {
        try (FileReader fr = new FileReader(path);
             BufferedReader br = new BufferedReader(fr)) {
            return br.readLine();
        }
    }

在此示例中,在try-with-resources语句中声明的资源是FileReaderBufferedReader。这些资源的声明语句出现在try关键字后面的括号内。在Java SE 7及更高版本中,类FileReaderBufferedReader实现接口java.lang.AutoCloseable。因为FileReaderBufferedReader示例是在try-with-resource语句中声明的,无论try语句是正常完成还是突然完成,它们都将被关闭(作为方法BufferedReader.readLine抛出IOException的结果)。

相关问题