所有Java输出流都有缓冲区吗



我使用了带有套接字的OutputStreamWriter。当我尝试写入数据时,我发现数据没有发送出去。所以我尝试了flush(),它成功了。

我想问一些问题:

  1. 所有输出流都有缓冲区吗?那么,像BufferedOutputStream这样的类有什么独特的好处吗?(因为有缓冲区(
  2. 当我使用CCD_ 4时。缓冲区中的数据是否已消失或被清除?我测试了它,缓冲区中的数据没有成功写入。但我在很多地方看到,调用close()会刷新缓冲区中的数据吗

并非所有OutputStream实现都有缓冲区。

这是微不足道的证明,因为你可以实现自己的。

OutputStream的大多数使用通常会涉及某个级别的缓冲区

BufferedOutputStream是显而易见的候选者,其中缓冲区直接位于类中,作为类的主要特征。通过这种方式,您可以向任何其他OutputStream添加显式缓冲。

与操作系统通信的OutputStream,如为网络连接返回的FileOutputStreamOutputStream,本身没有显式缓冲区,但会写入可能有或没有自己缓冲区的操作系统(例如,大多数操作系统不会在write系统调用中立即写入文件,只会在关闭或一段时间后刷新(。

在任一情况下(OutputStream中的直接缓冲器或底层系统缓冲器(,CCD_;真实的";目标

请注意,在符合条件的OutputStream上,关闭之前的flush不应该是必需的。

并非所有的OutputStream实现都执行缓冲,尽管缓冲是一个非常常见的特性,因为它们将flush()方法定义为OutputStream合同的一部分(特别是通过扩展Flushable接口(。我认为最好的信息来源是该方法的Javadoc:

刷新此输出流并强制写出任何缓冲的输出字节。flush的一般约定是,调用它表明,如果先前写入的任何字节已被输出流的实现缓冲,则这些字节应立即写入其预期目的地。

如果该流的预期目的地是底层操作系统提供的抽象,例如文件,则刷新流仅保证先前写入流的字节被传递到操作系统进行写入;它不能保证它们实际上被写入到诸如磁盘驱动器之类的物理设备。

OutputStreamflush方法不起任何作用。

我强调了一部分,很明显,是否实现缓冲取决于实现。

最新更新