java中BufferedOutputStream的好处是什么?不';不是每个输出流都有一个缓冲区吗?

java中BufferedOutputStream的好处是什么?不';不是每个输出流都有一个缓冲区吗?,java,stream,buffer,outputstream,Java,Stream,Buffer,Outputstream,我的问题在某种程度上与此类似: 我已经在那里读到了答案,但还有一件事我并不真正理解: 因此,在Java中,BufferedOutputStream有一个内部缓冲区。如果此缓冲区已满或调用了flush(),它会将数据写入底层OutputStream(传递给BufferedOutputStream的构造函数的数据)。 到目前为止还可以。但对我来说,它看起来好像实际上任何OutputStream都会有这样一个缓冲区——就像基类OutputStream有一个方法flush()。此方法的描述是:“刷新此输

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

您好,
Daniel

OutputStream没有缓冲区,您可以检查源代码。BufferedOutputStream有自己的缓冲区,它的flush()将字节从自己的缓冲区写入操作系统,然后刷新操作系统缓冲区。为什么使用BufferedOutputStream效率更高-因为OutputStream.write每次都可能调用OS,这是一项昂贵的操作,而BufferedOutputStream.write将字节放入缓冲区,并仅在缓冲区已满或处于刷新状态时调用OS,您可以检查源代码。BufferedOutputStream有自己的缓冲区,它的flush()将字节从自己的缓冲区写入操作系统,然后刷新操作系统缓冲区。为什么使用BufferedOutputStream更有效?因为OutputStream.write每次都可能调用操作系统,这是一项昂贵的操作,而BufferedOutputStream.write将字节放入缓冲区,并仅在缓冲区已满或处于刷新状态时调用操作系统。基类是抽象的。这意味着它定义了接口和所有输出流的一些常见行为。无法实例化
OutputStream
实例

文件明确指出:

OutputStream的flush方法不执行任何操作

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

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

文件明确指出:

OutputStream的flush方法不执行任何操作


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

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