我相信并在很多帖子中读到,在Java上,close
方法可以在flush
的任何JDK后代上调用OutputStream
方法而无需先前的close
调用。实际上我总是覆盖(当我需要时,很少见)flush
在最终结束前调用close
。我希望看到一些官方文档明确指出,可以在没有flush
的情况下安全地致电alias rh='function _rh(){ sed -i '\''$d'\'' ~/.bash_history ; };_rh'
。
某些文件在哪里说这个?
答案 0 :(得分:2)
非常好的问题! 是的,打电话给flush()
似乎。
现在,关于OutputStream或其实现的各种接口(如Closeable)的Javadoc都没有提到关闭流之前调用flush()
的任何内容。它已经很久了。
但是,如果您查看其他Writer
类,例如BufferedWriter,PrintWriter等,close()
文档会明确说明流在关闭之前已刷新。这是因为它们都实现了Writer类,并且那里的文档指定了这种行为。
现在,你的猜测和我的一样好。但是,当我在关闭流之前没有刷新时,我从未遇到过任何问题。所以,我怀疑确实调用了flush()
,这很可能是Flushable
接口的结果。
我发现一个常见的特性是,如果一个类实现了Writer
接口,那么文档总是提到 close()
在首先调用flush()
后关闭流的事实< / em>的
修改!!! 强>
OutputStream
是一个抽象类,我挖得更深一些。我发现FilterOutputStream恰好延伸OutputStream
。来自source code for close()
方法......
public void close() throws IOException {
try {
flush();
} catch (IOException ignored) {
}
out.close();
}
}
BufferedOutputStream,DataOutputStream
,PrintStream
扩展FilterOutputStream
,因此继承了相同的close()
方法。如果不是全部,至少,这些课程中的 close()
会拨打flush()
。
答案 1 :(得分:0)
跟随@Debosmit Rays领导并检查了来源。
只要扩展FilterOutputStream或ObjectOutputStream的类不覆盖close函数,FilterOutputStream的子类也应该刷新。