【问题标题】:Where is the documentation for the close without flush没有刷新的关闭文档在哪里
【发布时间】:2016-03-24 06:43:02
【问题描述】:

我相信并在许多帖子中读到,在 Java 上,无需对 OutputStream 的任何 JDK 后代进行先前的 flush 调用,就可以调用 close 方法。实际上,我总是覆盖(当我需要它时,很少见)close 在最后关闭之前调用 flush。我希望看到一些官方文档清楚地说明没有flush 可以安全地调用close

一些文档在哪里说这个?

【问题讨论】:

标签: java


【解决方案1】:

非常好的问题! 是的,要打给flush()似乎

现在,与OutputStream 或它实现的各种接口(如Closeable)相关的Javadocs 都没有提及在关闭流之前调用flush() 的任何内容。这种情况已经很久了。

但是,如果您查看其他 Writer 类,如 BufferedWriterPrintWriter 等,close() 文档特别声明流在关闭之前已刷新。这是因为它们都实现了Writer 类,并且那里的文档指定了这种行为。

现在,您的猜测与我的猜测一样好。但是,当我在关闭流之前没有刷新时,我从来没有遇到过任何问题。所以,我怀疑确实调用了flush(),很可能是Flushable 接口的结果。

我发现的一个共同特点是,如果一个类实现了Writer 接口,文档总是提到close() 在首先调用flush() 之后关闭流。 p>

编辑!!!

OutputStream 作为一个抽象类,我挖得更深了。我发现FilterOutputStream 恰好扩展了OutputStream。来自source codeclose() 方法...

public void close() throws IOException {
    try {
            flush();
        } catch (IOException ignored) {

        }
        out.close();
    }
}

BufferedOutputStream, DataOutputStream, PrintStream 扩展 FilterOutputStream 并因此继承相同的 close() 方法。如果不是全部,至少,这些课程中的 close() 会调用 flush()

【讨论】:

    【解决方案2】:

    关注@Debosmit Rays 并检查了来源。

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

    只要扩展 FilterOutputStream 或 ObjectOutputStream 的类不重写 close 函数,FilterOutputStream 的子类也应该刷新。

    【讨论】:

    • 一些问题。 FilterOutputStream 确实在 close 方法中刷新。 OutputStream 是抽象类;所以它显然不会有实现。
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 2015-06-30
    • 2020-11-18
    相关资源
    最近更新 更多