Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在刚创建输出缓冲区时需要刷新它?_Java_Io_Flush - Fatal编程技术网

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

Java 为什么在刚创建输出缓冲区时需要刷新它?,java,io,flush,Java,Io,Flush,在下面的场景中 ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.flush(); // Do stuff with it 为什么在初始创建后总是需要刷新缓冲区? 我一直看到这一点,我真的不明白什么是必须冲洗的。除非另有规定,我希望新创建的变量是空的。 有点像买了一个垃圾桶,发现里面有一小堆垃圾。当您将数据写入流时,会发生一定量的缓冲,并且您永远无法确切地知道最后一个数据实际

在下面的场景中

ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.flush();
// Do stuff with it
为什么在初始创建后总是需要刷新缓冲区?
我一直看到这一点,我真的不明白什么是必须冲洗的。除非另有规定,我希望新创建的变量是空的。


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

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

在以专业水平编写Java的15年中,我从未遇到过在写入流之前刷新流的需要。
刷新操作根本不起任何作用,因为没有任何东西可以刷新。
您希望在关闭流之前刷新它,尽管关闭操作应该这样做,但通常认为显式刷新是最佳做法(我遇到过这样的情况,在这种情况下确实会产生影响,显然关闭操作并没有首先进行刷新。

可能您对此感到困惑?

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

根据,标头存在以下内容之一:

如果在生成ObjectInputStream时报头未到达,则此调用将挂起,直到收到报头字节为止


这意味着,如果所讨论的协议是用
ObjectStream
s编写的,它应该在创建
ObjectOutputStream

后刷新。我认为这不是真的必要。javadoc怎么说?我不是一直都看到这一点……事实上,我从来没有看到过。你在哪里遇到过它?我从来没有这样做过。也从来没有遇到过问题。可以吗您是否共享这些教程的链接?我已经有一段时间没有阅读这些教程了,但我在这里找到了一些:我不确定这是否解释了为什么在执行任何写入操作之前必须刷新输出流。是的,在写入流之后,但是在初始创建之后呢?我没有看到在wr之前发生相同的情况iting anything.True,但似乎与问题无关。OP是问为什么流在创建后需要立即刷新(其中不应该有任何数据)。读取文件时,不需要刷新,所以您甚至找不到刷新()方法。对于所有输出文件,您可能会发现缓冲区没有刷新,因此文件将不完整,您可能看不到输出。我不会将初始创建后的刷新与关闭流之前的刷新混淆。我一直认为,在检索OutputStream对象后,一些东西从一开始就存在于缓冲区中,我只是想知道它是什么,为什么它会存在。
magic version