java 中的 BufferedOutputStream 有什么好处?不是每个 OutputStream 都有缓冲区吗?

What is the benefit of a BufferedOutputStream in java? Doesn't every OutputStream have a buffer?

我的问题在某种程度上类似于这个问题: what's the purpose of BufferedOutputStream? 我已经阅读了那里的答案,但还有一件事我不太明白: 所以在 Java 中 BufferedOutputStream 有一个内部缓冲区。如果此缓冲区已满或调用了 flush(),它会将数据写入底层 OutputStream(传递给 BufferedOutputStream 的构造函数的那个​​)。 到目前为止没问题。但对我来说,它看起来好像实际上任何 OutputStream 都会有这样一个缓冲区——因为基础 class OutputStream 有一个方法 flush()。这个方法的描述是:"Flushes this output stream and forces any buffered output bytes to be written out." 那么...如果所有 OutputStreams 都有缓冲区,那么 BufferedOutputStream 有什么好处呢? 可能我误会了什么......你能帮帮我吗?

您好, 丹尼尔

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

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

文档明确指出

The flush method of OutputStream does nothing.

是否使用缓冲区由具体实现决定。