【问题标题】:What is the benefit of a BufferedOutputStream in java? Doesn't every OutputStream have a buffer?java中的BufferedOutputStream有什么好处?不是每个 OutputStream 都有缓冲区吗?
【发布时间】:2018-03-26 23:33:42
【问题描述】:

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

您好, 丹尼尔

【问题讨论】:

  • '此方法的描述为:“刷新此输出流并强制写出任何缓冲的输出字节'。继续阅读。您的问题基于错误的假设。
  • 不是每个OutputStream 都有一个内部缓冲区,但是当您使用足够大的数组参数调用write 时,仍然会有效地拥有一个缓冲区。在这方面,BufferedOutputStream 确实已经过时并且被过度使用了。通常情况下,最好修复执行过多小写入的代码,而不是使用BufferedOutputStream 来解决问题。对于使用合理缓冲区大小的代码,另外使用BufferedOutputStream 甚至会降低性能。

标签: java stream buffer outputstream


【解决方案1】:

OutputStream 没有缓冲区,你可以查看源代码。 BufferedOutputStream 有自己的缓冲区,它的 flush() 将字节从自己的缓冲区写入 OS,然后刷新 OS 缓冲区。为什么使用 BufferedOutputStream 更有效 - 因为 OutputStream.write 可能每次都调用 OS,这是一个昂贵的操作,而 BufferedOutputStream.write 将字节放入缓冲区并仅在缓冲区已满或刷新时调用 OS

【讨论】:

  • 它的flush()什么都不做。没有“刷新操作系统缓冲区”。
  • 'Flushes OS buffer' 如何?
【解决方案2】:

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

文档明确指出

OutputStream 的 flush 方法什么都不做。

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

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2010-10-03
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多