为什么在刚创建输出缓冲区时需要刷新它?

时间:2014-03-03 11:24:37

标签: java io flush

在以下场景中

ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.flush();
// Do stuff with it

为什么在初始创建后始终需要刷新缓冲区? 我一直都看到这一点而且我并不真正理解必须刷新什么。除非另有说明,否则我希望新创建的变量为空。

有点像买垃圾桶,在里面找到一堆垃圾。

3 个答案:

答案 0 :(得分:2)

在专业级别编写Java的超过15年中,我从来没有遇到过在写入之前刷新流的需要。
冲洗操作根本不会做任何事情,因为没有什么可以冲洗 你想在关闭它之前刷新流,虽然关闭操作应该为你做这件事通常被认为是最好的做法明确地做(并且我遇到了确实有所作为的情况,显然关闭操作实际上没有先冲洗。
也许你对此感到困惑?

答案 1 :(得分:1)

当您将数据写入流时,会发生一定量的缓冲,并且您无法确切知道何时实际发送最后一个数据。您可以在关闭流之前对流执行许多rite操作,并且调用flush()方法可以保证您认为已经编写的最后一个数据实际上已经到达文件。无论何时使用文件,无论是读取文件还是写入文件,都应该调用close()方法。当您进行文件I / O时,您使用昂贵且有限的操作系统资源,因此当您完成后,调用close()将释放这些资源。

答案 2 :(得分:0)

使用ObjectInputStreamObjectOutputStream时需要这样做,因为它们会在调用第一个写入之前在流上发送标头。对flush()的调用会将该标头发送到远程端。

根据spec,标题包含以下内容:

magic version

如果标头在构建ObjectInputStream时没有到达,则此调用将挂起,直到它收到标头字节。

这意味着如果相关协议是用ObjectStream编写的,则应在创建ObjectOutputStream后刷新。