Java的OutputStream
包含一个flush()
方法,您可以用来强制它将缓冲的输出写入文件,套接字,设备等。
我刚刚在我的一个应用程序中注意到,它在刷新数据到文件之前会缓冲很多数据,这让我感到好奇:Java如何确定何时刷新时间?? >
我假设它会尝试根据可用的内存量做出一些明智的决定,因此在内存受限时可能会更频繁地刷新。但这只是有根据的猜测。
答案 0 :(得分:0)
des
是一个抽象类,默认情况下不实现任何刷新行为。何时以及如何刷新数据取决于实现OutputStream
函数的具体类。冲洗策略可以有很大不同。默认情况下,write
使用的缓冲区大小为8,192字节。以大块刷新数据可最大程度减少写入操作系统资源时的系统调用次数,但会增加复杂性和延迟,因为未刷新的数据可能会在缓冲区中保留额外的时间。最佳缓冲策略将取决于要写入的基础设备或通道。如果要确保在某个时刻刷新了所有先前写入的数据,请显式调用BufferedOutputStream
。
答案 1 :(得分:0)
@jspcal所说的一切都从我这里得到+1。我将补充说,回答您问题的最好方法是查看代码。 Java源代码通常很容易上手。如果您只是前面所知道的,那么您需要确保知道什么实现正在支持OutputStream对象。
我知道最简单的方法是使用一个好的调试器。您可以肯定地知道正确的代码,方法是在调用时将断点放在所讨论的OutputStream对象中,例如f.write()或f.flush(),然后逐步进入调用。我希望您可以弄清楚什么时候可能会对感兴趣的OutputStream的任何特定实现调用f.flush()。
如果您只是一般感兴趣,可以查看JavaDoc for OutputStream,它应该为您提供至少一个最重要的抽象类的标准类的列表。
...必须自己尝试查找该文档。这是我得到的:
另请参阅: BufferedOutputStream,ByteArrayOutputStream,DataOutputStream, FilterOutputStream,InputStream
列表中有InputStream,我想这些都不是OutputStream的实现。我知道他们为什么要提到InputStream,OutputStream的输入模拟。
结果证明, BufferedOutputStream 根本没有做任何有趣的事情。默认为8K缓冲区。当提供的要写出的数据超出缓冲区中剩余的空间时,它仅刷新A),或者在关闭流之前刷新B)。我注意到了一个有趣的地方。如果您在单个write()调用中写入的内容超出缓冲区大小,则代码将刷新缓冲区,然后直接将新数据写入基础流,而无需完全通过缓冲区。因此,如果您写的内容大于缓冲区的大小,则缓冲区之后将始终为空。很有道理。因此,如果您的所有写操作都大于缓冲区大小,则 BufferedOutputStream 实际上不会做任何事情。