Java什么时候刷新OutputStream?

问题描述 投票:0回答:2

Java的OutputStream包含一个flush()方法,您可以使用它来强制它将缓冲的输出写入文件,套接字,设备等。

我刚刚在我的应用程序中注意到它在将其刷新到文件之前缓冲了相当多的数据并且让我很好奇:Java如何确定何时需要刷新?

我会假设它会尝试根据可用内存量做出一些明智的决定,因此在内存受限时可能会更频繁地刷新。但这只是一个有根据的猜测。

java outputstream
2个回答
0
投票

OutputStream是一个抽象类,默认情况下不执行任何刷新行为。何时以及如何刷新数据取决于实现write函数的具体类。冲洗策略可以有很大不同。默认情况下,BufferedOutputStream使用8,192字节的缓冲区大小。以大块方式刷新数据可以最大限度地减少写入操作系统资源时的系统调用次数,但会增加复杂性和延迟,因为未刷新的数据可能会在缓冲区中保留一段时间。最佳缓冲策略取决于要写入的底层设备或通道。如果要确保在某个点刷新所有先前写入的数据,请显式调用flush


0
投票

@jspcal所说的一切都得到了我的+1。我要补充一点,回答问题的最佳方法是查看代码。 Java源代码通常非常平易近人。如果你事先知道的话,你需要确保知道什么实现支持你的OutputStream对象。

我知道这样做的最简单方法是使用一个好的调试器。您可以通过在调用OutputStream对象(例如f.write()或f.flush())中放置一个断点来确定您正在查看正确的代码,然后进入调用。我希望您可以找出f.flush()为您可能感兴趣的OutputStream的任何特定实现调用的时间。

如果您只是感兴趣,可以查看JavaDoc for OutputStream,它应该给出一个至少包含该抽象类的子类的最重要标准类的列表。

......我必须自己尝试doc查找。这是我得到的:

另请参见:BufferedOutputStream,ByteArrayOutputStream,DataOutputStream,FilterOutputStream,InputStream

使用列表中的InputStream,我猜这些都不是OutputStream的实现。我可以看出为什么他们会提到InputStream,OutputStream的输入模拟。

事实证明,BufferedOutputStream根本没有做任何有趣的事情。它默认为8K缓冲区。它只刷新缓冲区A)当提供的数据写入超出缓冲区中剩余的空间时,或者B)在流关闭之前。我注意到一点有趣。如果在单个write()调用中写入的缓冲区大小超过缓冲区大小,则代码会刷新缓冲区,然后直接将新数据写入基础流,而无需通过缓冲区。因此,如果您编写的内容大于缓冲区大小,则缓冲区将始终为空。很有道理。因此,如果所有写入都大于缓冲区大小,BufferedOutputStream实际上并没有做任何事情。

© www.soinside.com 2019 - 2024. All rights reserved.