ByteArrayOutputStream和BufferedOutputStream的区别

7

ByteArrayOutputStreamBufferedOutputStream 都通过将数据放置在内存中的数组中进行缓冲。所以我的问题是:

  1. 这两者之间有什么区别?
  2. 何时使用 ByteArrayOutputStream,何时使用 BufferedOutputStream ?

由于我对此感到困惑,能否有人帮助我解决以上两个问题。


那个问题非常不同,它是在问:“将BufferedOutputStream包装在ByteArrayOutputStream周围是否比仅使用ByteArrrayOutputStream本身有任何优势?”我读了这个问题,但没有找到答案,请再检查一下。 - T-Bag
我在网络上找到的唯一区别是BufferedOutputStream将数据写入另一个流中,而ByteArrayOutputStream将数据写入字节数组中。 - T-Bag
你能解释一下这个吗? - T-Bag
非常感谢@GhostCat和jesper,非常感激你们所付出的努力...(Y) - T-Bag
只是想知道:在接受某个答案之前,您是否正在等待更多的答案?我的直觉是您不太可能会听到其他更多的回答了。 - GhostCat
3个回答

9

仅需查看Java文档:

ByteArrayOutputStream:

该类实现了一个输出流,数据被写入到一个字节数组中。

BufferedOutputStream:

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

所以,这两个东西是非常不同的:

  • 当您知道最终需要将某些数据作为字节数组使用时,使用第一个。
  • 第二个只是包装在任何其他类型的输出流周围的“包装器”-添加了缓冲。

就是这些!

如果您想体验不同的行为:创建一个写入文件的缓冲流和一个数组流。然后只需将字节推入每个流中。数组流最终会导致内存问题,而另一个流可能一直运行,直到用尽所有磁盘空间。


8

ByteArrayOutputStream将字节写入内存中的字节数组,而不是写入文件或网络套接字等其他目标。在写入数据后,您可以通过调用其上的toByteArray()来获取字节数组。

BufferedOutputStream包装另一个底层的OutputStream并为该底层流提供缓冲,以使I/O操作更加高效。底层流可以是任何类型的OutputStream,例如写入文件或网络套接字的流。

为什么需要使用缓冲:将大块数据写入文件系统比逐字节写入更有效率。如果您的程序需要写入许多小数据片段,则首先将这些小片段收集到缓冲区中,然后一次性将整个缓冲区写入磁盘更加高效。这就是BufferedOutputStream自动为您执行的操作。


1

BufferedOutputStream 允许使用缓冲区来提高性能。当缓冲区填满时,调用 write() 方法会导致底层输出流的 write() 方法被调用,并且缓冲区的内容被写入目标。下一次调用 BufferedOutputStreamwrite() 方法将把字节存储在缓冲区中,直到再次填满。

通常作为包装器使用,例如:

FileOutputStream fos = new FileOutputStream("file.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write( ... );

因此,最小化了底层操作系统函数的调用次数。 ByteArrayOutputStream 允许将字节流写入字节数组。

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