这里有一个简单的代码。
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("c:\\hello.txt"))));)
{
writer.write("Hello");
writer.flush();
}
所以基本上FileOutputStream
,OutputStreamWriter
和BufferedWriter
都是可关闭的资源。但是它们没有在try-with
语句中显式声明为单独的变量。在这种情况下,Java会在执行后自动关闭所有这些资源还是只关闭BufferedWriter
对象?
1条答案
按热度按时间8xiog9wr1#
Java将关闭
BufferedWriter
,这意味着它将关闭它 Package 的每个流。您可以以不同的方式编写代码,如下所示:这不会改变 try-with-resources 语句的工作方式,但它可能更容易阅读和理解关闭的工作方式。
下面是编写上述代码的另一种方式,可能有助于说明流关闭(此示例仅用于说明目的)。
在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
的对象,可以作为一种资源。下面的示例从文件中读取第一行。它使用
FileReader
和BufferedReader
的示例从文件中读取数据。FileReader
和BufferedReader
是程序完成后必须关闭的资源:在此示例中,在
try
-with-resources语句中声明的资源是FileReader
和BufferedReader
。这些资源的声明语句出现在try
关键字后面的括号内。在Java SE 7及更高版本中,类FileReader
和BufferedReader
实现接口java.lang.AutoCloseable
。因为FileReader
和BufferedReader
示例是在try
-with-resource语句中声明的,无论try
语句是正常完成还是突然完成,它们都将被关闭(作为方法BufferedReader.readLine
抛出IOException
的结果)。