BufferedOutputStream的目的是什么?

21
我想知道 BufferedOutputStream 的作用,以及在使用它时是否有性能提升?

2
值得注意的是,如果您已经在编写大块数据(例如8K或更多),这可能会略微影响性能(就像在BufferedOutputStream周围包装BufferedOutputStream一样)。 - Peter Lawrey
4个回答

18

以下是来自BufferedOutputStream API的一行:

该类实现了一个缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不一定会导致每个写入的字节都调用底层系统。

它可以在缓冲区内完成大多数操作,而不必调用底层系统。

例如,考虑写入文件:如果没有缓冲区,每个单独的字节都需要进行系统调用,这显然会很慢。


5
这句话可能是错误的,因为没有缓冲区,它需要为每个字节访问硬盘。 - Raedwald
1
@Raedwald 我对此并不确定。从Java API中可以看到:“OutputStream的write方法在每个要写出的字节上调用一个参数的write方法。鼓励子类重写此方法并提供更高效的实现。” - akgren_soar
调用单字节输出方法不会导致单个磁盘写入。操作系统会自行缓冲写入。 - Raedwald
@Raedwald,它不一定需要访问,但它“可以”。 - bvdb
3
Java缓冲输出流的确切目的不是为了减轻磁盘I/O的压力,而是为了降低调用write()系统调用的频率,因为这是非常昂贵的。由于操作系统页面缓存的存在,使用缓冲输出流与否对性能没有太大的区别。 - ryan_tu

9
正如其名称所示,BufferedOutputStream有一个内部缓冲区(byte[]),用于存储单个小写操作的内容。当缓冲区已满、流被刷新或流被关闭时,它们将被写入底层的OutputStream
如果对于底层OutputStream的每个写操作都存在(相对较大的)固定开销,例如FileOutputStream(必须进行操作系统调用)和许多压缩流,则这可能会产生很大的差异。
同时,许多基于流的库使用自己的缓冲区(如XML和JSON编写器),因此使用BufferedOutputStream没有任何好处。但它自己的开销相对较低,因此风险不大。

3

BufferedOutputStream提供输出数据缓冲,通过将要写入的值存储在缓冲区中,并在缓冲区填满或调用flush()方法时实际将其写出,从而提高效率。


0
Java BufferedOutputStream类用于缓存输出流。它内部使用缓冲区来存储数据。与直接将数据写入流相比,它可以提高效率,从而使性能更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接