2014-03-03 64 views
6

在以下情形为什么在创建输出缓冲区时需要刷新输出缓冲区?

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

为什么总是必要冲洗初始创建后的缓冲?
我一直都在看这个,我不是很了解什么必须被刷新。我有点期待新创建的变量为空,除非另有规定。

有点像购买垃圾桶,并发现里面有一小堆垃圾。

+0

我不认为这是真的有必要。什么说javadoc? – robermann

+4

我一直没有看到这个......事实上,或者从来没有。你在哪里遇到它? –

+0

我从来没有这样做。而且从未面临过问题。 – Batty

回答

0

这是需要使用任一ObjectInputStreamObjectOutputStream的时候,因为他们送过流的报头中的第一写被调用。该调用flush()前会将该标题发送到远程端

根据spec,标题存在以下内容S:

magic version 

如果标题不此刻ObjectInputStream的是建立到达,此调用将挂起,直到收到的头字节。

这意味着如果有问题的协议是用ObjectStream s写的,它应该在创建ObjectOutputStream后刷新。

1

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

+1

我不确定这是否解释了在执行任何写入操作之前为什么需要刷新输出流*。 –

+0

在写入流之后是,但初始创建后如何?在写任何东西之前,我没有看到相同的情况。 –

+1

是的,但似乎与问题无关。 OP在询问为什么在创建流之后为什么需要刷新流(应该没有任何数据)。 – Pshemo

2

在专业级别编写Java超过15年的时间里,我从未遇到在写入数据流之前刷新数据流的需求。
冲洗操作根本就什么都不做,因为没有什么可冲洗的。
你想在关闭它之前刷新数据流,尽管关闭操作应该为你做这件事,但它通常被认为是最好的做法,明确地做到这一点(并且我遇到过这种情况确实有所作为,实际上不是先做冲洗。
也许你是混淆了吗?

+0

在关闭流之前,我不会在初始创建之后使用刷新冲洗混淆。我被引导认为在检索OutputStream对象后,一些东西从一开始就驻留在缓冲区中。我只是想知道*那是什么,为什么它甚至在那里。 – krystah