2017-10-15 1033 views
0

我的问题是在某些方面类似于此: what's the purpose of BufferedOutputStream? 我已阅读的答案在那里,但还是有一件事我真的不明白: 所以在Java中的BufferedOutputStream具有内部缓冲区。如果此缓冲区已满或flush()被调用,它将数据写入基础OutputStream(传递给BufferedOutputStream的构造函数的那个​​)。 到目前为止确定。但对我来说,它看起来像是实际上任何OutputStream都会有这样一个缓冲区 - 因为基类OutputStream有一个flush()方法。此方法的描述是:“刷新此输出流并强制写出所有缓冲的输出字节。” 因此......如果所有的OutputStream都有一个缓冲区,那么BufferedOutputStream有什么好处呢? 也许我误解了一些东西......你能帮我吗?java中BufferedOutputStream的好处是什么?是否每个OutputStream都没有缓冲区?

问候, 丹尼尔

+0

'这个方法的描述是sais:“刷新这个输出流,并强制任何缓冲的输出字节被写出',你的问题是基于一个错误的假设 – EJP

+0

并非每个'OutputStream'都有一个内部缓冲区,但是当你用一个足够大的数组参数调用'write'的时候,它仍然会有一个缓冲区,在这方面,'BufferedOutputStream'确实已经过时并且是一个过度使用的特性,更多的情况是修复代码太多小写,而不是通过使用BufferedOutputStream来解决问题,对于使用合理缓冲区大小的代码,另外使用BufferedOutputStream甚至可以降低性能 – Holger

回答

1

的基类OutputStream是抽象。这意味着它定义了接口和所有输出流的一些常见行为。您不能实例化OutputStream实例。

的文件明确指出,

OutputStream的flush方法不做任何事。

确定是否使用缓冲区取决于具体实现。

0

的OutputStream没有缓冲,你可以查看源代码。 BufferedOutputStream有它自己的缓冲区,其flush()将自己的缓冲区中的字节写入OS,然后刷新OS缓冲区。为什么使用的BufferedOutputStream是更有效的 - 因为OutputStream.write可各自的时间,这是昂贵的操作调用OS,并把BufferedOutputStream.write字节缓冲并调用OS仅当缓冲区已满或在冲洗

+0

它的flush()不做* nothing *。 OS缓冲区'关于它。 – EJP

+0

'刷新OS缓冲区'如何? – EJP

相关问题