使用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/AutoCloseable.html
Closeable
和AutoCloseable
是通用接口,对刷新一无所知。 所以你在他们的文档中找不到任何关于它的信息 – 除了一些关于释放资源的话 。
另一方面, 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。 关闭先前关闭的流无效。