关闭而无需刷新的文档在哪里?

3

我相信并看到很多帖子中说,在Java中,可以在任何OutputStream的JDK派生类上调用close方法而不需要先调用flush。实际上,当我需要时(这很少见),我总是重写close以在最终关闭之前调用flush。我希望能够看到一些官方文档清楚地说明可以安全地调用close而无需flush

哪里有这样的文件说明?


这可能会有所帮助,我看到很多关于这个问题的混淆,没有统一的答案:https://dev59.com/tHE85IYBdhLWcg3whT9r - epoch
有些人似乎会指定这一点,例如: http://docs.oracle.com/javase/8/docs/api/java/io/OutputStreamWriter.html#close%28%29 https://docs.oracle.com/javase/7/docs/api/java/io/FilterOutputStream.html 也有相反的例子: https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html#close%28%29 - Fakenick
我编辑了我的回答。 - Debosmit Ray
@epoch,您能否请验证一下我所写的是否正确? - Debosmit Ray
@Fakenick 抱歉,我误读了文档。很奇怪他们没有遵循模板或类似的东西。 - Debosmit Ray
显示剩余2条评论
2个回答

2
非常好的问题!是的,似乎确实调用了flush()。
现在,与OutputStream相关的所有Javadocs或它实现的各种接口(如Closeable)都没有提到在关闭流之前调用flush()。这种情况已经持续了相当长的时间。
但是,如果您查看其他Writer类(如BufferedWriter、PrintWriter等),close()文档明确指出在关闭流之前会刷新流。这是因为它们都实现了Writer类,而该文档指定了此行为。
现在,您和我一样猜测。但是,当我在关闭流之前没有刷新时,我从未遇到任何问题。因此,我怀疑确实会调用flush(),很可能是由于Flushable接口的结果。
我发现一个共同点是,如果一个类实现了Writer接口,那么文档总是提到close()在首先调用flush()后关闭流。
编辑!!!
OutputStream是一个抽象类,我深入挖掘了一下。我找到了FilterOutputStream,它恰好扩展了OutputStream。从它的close()方法的源代码中...
public void close() throws IOException {
    try {
            flush();
        } catch (IOException ignored) {

        }
        out.close();
    }
}

BufferedOutputStreamDataOutputStreamPrintStream扩展了FilterOutputStream,因此继承了相同的close()方法。如果不是全部,至少这些类中的close()方法会调用flush()


0

跟随@Debosmit Rays的步伐并检查源代码。

  • ByteArrayOutputStream在关闭时不会刷新
  • FileOutputStream在关闭时不会刷新
  • FilterOutputStream在关闭时会刷新
  • ObjectOutputStream在关闭时会刷新
  • PipedOutputStream在关闭时不会刷新
  • org.omg.CORBA_2_3.portable.OutputStream在关闭时不会刷新

只要扩展FilterOutputStream或ObjectOutputStream的类没有覆盖close函数,FilterOutputStream的子类也应该刷新。


几个问题。FilterOutputStreamclose 方法中确实会执行 flush 操作。OutputStream 是一个抽象类,显然不会有具体的实现。 - Debosmit Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接