我使用了带有套接字的OutputStreamWriter
。当我尝试写入数据时,我发现数据没有发送出去。所以我尝试了flush()
,它成功了。
我想问一些问题:
- 所有输出流都有缓冲区吗?那么,像
BufferedOutputStream
这样的类有什么独特的好处吗?(因为有缓冲区( - 当我使用CCD_ 4时。缓冲区中的数据是否已消失或被清除?我测试了它,缓冲区中的数据没有成功写入。但我在很多地方看到,调用
close()
会刷新缓冲区中的数据吗
并非所有OutputStream
实现都有缓冲区。
这是微不足道的证明,因为你可以实现自己的。
但OutputStream
的大多数使用通常会涉及某个级别的缓冲区。
BufferedOutputStream
是显而易见的候选者,其中缓冲区直接位于类中,作为类的主要特征。通过这种方式,您可以向任何其他OutputStream
添加显式缓冲。
与操作系统通信的OutputStream
,如为网络连接返回的FileOutputStream
或OutputStream
,本身没有显式缓冲区,但会写入可能有或没有自己缓冲区的操作系统(例如,大多数操作系统不会在write
系统调用中立即写入文件,只会在关闭或一段时间后刷新(。
在任一情况下(OutputStream
中的直接缓冲器或底层系统缓冲器(,CCD_;真实的";目标
请注意,在符合条件的OutputStream
上,关闭之前的flush
不应该是必需的。
并非所有的OutputStream
实现都执行缓冲,尽管缓冲是一个非常常见的特性,因为它们将flush()
方法定义为OutputStream
合同的一部分(特别是通过扩展Flushable
接口(。我认为最好的信息来源是该方法的Javadoc:
刷新此输出流并强制写出任何缓冲的输出字节。flush的一般约定是,调用它表明,如果先前写入的任何字节已被输出流的实现缓冲,则这些字节应立即写入其预期目的地。
如果该流的预期目的地是底层操作系统提供的抽象,例如文件,则刷新流仅保证先前写入流的字节被传递到操作系统进行写入;它不能保证它们实际上被写入到诸如磁盘驱动器之类的物理设备。
OutputStream
的flush
方法不起任何作用。
我强调了一部分,很明显,是否实现缓冲取决于实现。