在以下场景中
ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.flush();
// Do stuff with it
为什么在初始创建后始终需要刷新缓冲区?
我一直都看到这一点而且我并不真正理解必须刷新什么。除非另有说明,否则我希望新创建的变量为空。
有点像买垃圾桶,在里面找到一堆垃圾。
答案 0 :(得分:2)
在专业级别编写Java的超过15年中,我从来没有遇到过在写入之前刷新流的需要。
冲洗操作根本不会做任何事情,因为没有什么可以冲洗
你想在关闭它之前刷新流,虽然关闭操作应该为你做这件事通常被认为是最好的做法明确地做(并且我遇到了确实有所作为的情况,显然关闭操作实际上没有先冲洗。
也许你对此感到困惑?
答案 1 :(得分:1)
当您将数据写入流时,会发生一定量的缓冲,并且您无法确切知道何时实际发送最后一个数据。您可以在关闭流之前对流执行许多rite操作,并且调用flush()方法可以保证您认为已经编写的最后一个数据实际上已经到达文件。无论何时使用文件,无论是读取文件还是写入文件,都应该调用close()方法。当您进行文件I / O时,您使用昂贵且有限的操作系统资源,因此当您完成后,调用close()将释放这些资源。
答案 2 :(得分:0)
使用ObjectInputStream
和ObjectOutputStream
时需要这样做,因为它们会在调用第一个写入之前在流上发送标头。对flush()
的调用会将该标头发送到远程端。
根据spec,标题包含以下内容:
magic version
如果标头在构建ObjectInputStream时没有到达,则此调用将挂起,直到它收到标头字节。
这意味着如果相关协议是用ObjectStream
编写的,则应在创建ObjectOutputStream
后刷新。