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
答案 0 :(得分:12)
Closeable
和AutoCloseable
是通用接口,对刷新一无所知。所以你不能在他们的文档中找到关于它的任何信息 - 除了关于释放资源的一些话。
另一方面,Writer
是一个更具特色的抽象类,现在知道有关刷新的内容。方法Writer.close()
的文档的一些摘录:
关闭流,首先刷新。
所以 - 是的 - 当使用作家时,close
也总是flush
。这基本上意味着你必须在试图找出结束真正做的事情时查阅你正在使用的具体类的文档。
答案 1 :(得分:9)
使用try-with-resource阻止时,资源会自动关闭。作为此过程的一部分,它还将自动调用flush。
正如BufferedWriter的close方法的文档中提到的那样:
关闭流,先冲洗它。流关闭后, 进一步的write()或flush()调用将导致IOException 抛出。
答案 2 :(得分:4)
引用BufferedWriter.close()的javadoc:
关闭流,首先冲洗。
答案 3 :(得分:3)
在这种情况下要写入的最小代码量:
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
bw.write("Test");
} catch (IOException e) {
// handle exception
}
因此,您不需要明确调用flush方法,因为它将由close方法调用,如javadoc中所述:
关闭流,先冲洗它。流关闭后, 进一步的write()或flush()调用将导致IOException 抛出。关闭之前关闭的流无效。
此行为继承自Writer类,因此除了BufferedWriter之外,还提供了相同的行为:CharArrayWriter,FilterWriter,OutputStreamWriter,{ {3}},PipedWriter,PrintWriter。
StringWriter或tryWithResources的文档中未提供此行为,因为该行为特定于AutoCloseable的给定实现。当Writer扩展Writer时,它将在退出try {}块时调用Closeable方法,并且close方法将首先调用 close已如上所述。
答案 4 :(得分:1)
来自Javdocs:
try-with-resources语句是一个声明一个的try语句 或更多资源。资源是必须在之后关闭的对象 程序完成了。 try-with-resources语句 确保在语句结束时关闭每个资源。任何 实现
java.lang.AutoCloseable
的对象,包括所有 实现java.io.Closeable
的对象可以用作 资源。
BufferedWriter.close()
明确指出:
关闭流,先冲洗它。关闭流后,进一步的write()或flush()调用将导致抛出IOException。关闭之前关闭的流无效。
答案 5 :(得分:1)
我真的不明白为什么其他答案集中在BufferedWriter
而不是try-with-resources
上。
我要么找不到任何规范,要么提到try-with-resources
语句在flush()
的任何对象上调用Flushable
。
https://docs.oracle.com/javase/specs/jls/se13/html/jls-14.html#jls-14.20.3
不要依赖供应商特定实现的任何未记录/未指定的行为。
try (OutputStream o = open()) {
//writeSome
o.flush(); // won't hurt!
}