使用try-with-resources时需要flush()调用

try-with-resources隐式调用flush()吗?

如果是,在下面的代码片段中,可以安全地删除bw.flush()吗?

 static void printToFile1(String text, File file) { try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) { bw.write(text); bw.flush(); } catch (IOException ex) { // handle ex } } 

PS。 我在官方文件中没有看到任何关于它的描述:

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html https://docs.oracle.com/javase/8/docs/api/java/lang/Au​​toCloseable.html

CloseableAutoCloseable是通用接口,对刷新一无所知。 所以你在他们的文档中找不到任何关于它的信息 – 除了一些关于释放资源的话

另一方面, Writer是一个更具特色的抽象类,现在知道有关刷新的内容。 一些摘录的方法Writer.close()的文档:

关闭流,先冲洗它

所以 – 是的 – 当使用作家时, close也总是会flush 。 这基本上意味着您在查找关闭实际执行的操作时,必须查阅您正在使用的具体类的文档。

使用try-with-resource块时,资源会自动关闭。 作为此过程的一部分,它还将自动调用flush。

正如在BufferedWriter的close方法的doc中所提到的:

关闭流,先冲洗它。 关闭流后,进一步的write()或flush()调用将导致抛出IOException。

引用BufferedWriter.close()的 javadoc:

关闭流,先冲洗它

在这种情况下要写入的最小代码量:

 try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) { bw.write("Test"); } catch (IOException e) { // handle exception } 

因此,您不需要显式调用flush方法,因为它将由close方法调用,如javadoc中所述:

关闭流,先冲洗它。 关闭流后,进一步的write()或flush()调用将导致抛出IOException。 关闭先前关闭的流无效。

此行为inheritance自Writer类,因此除了BufferedWriter之外,还提供了相同的行为: CharArrayWriter , FilterWriter , OutputStreamWriter , PipedWriter , PrintWriter , StringWriter 。

tryWithResources或AutoCloseable的文档中未提供此行为,因为该行为特定于Writer的给定实现。 当Writer扩展为Closeable时 ,它将在退出try {}块时调用close方法,close方法将首先调用flush ,如上所述。

来自Javdocs:

try-with-resources语句是一个声明一个或多个资源的try语句。 资源是在程序完成后必须关闭的对象。 try-with-resources语句确保在语句结束时关闭每个资源。 实现java.lang.AutoCloseable任何对象(包括实现java.io.Closeable所有对象)都可以用作资源。

BufferedWriter.close()明确声明:

关闭流,先冲洗它。 关闭流后,进一步的write()或flush()调用将导致抛出IOException。 关闭先前关闭的流无效。