ByteArrayOutputStream和BufferedOutputStream之间的区别

时间:2017-05-06 09:02:41

标签: java stream

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

  1. 这两者之间有什么区别。
  2. 何时使用ByteArrayOutputStream以及何时使用BufferedOutputStream
  3. 有些人可以帮我解决上面两个问题,因为我对此感到困惑。

3 个答案:

答案 0 :(得分:4)

看看javadoc:

ByteArrayOutputStream

  

此类实现一个输出流,其中数据被写入字节数组。

BufferedOutputStream

  

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

所以,那些是非常不同的东西:

  • 您知道自己有一些数据到底所需的第一个数据
  • 第二个只是围绕任何其他类型输出流的包装器 - 这会增加缓冲。

这就是全部!

如果您想体验不同的行为:创建一个写入文件的缓冲区和一个阵列。然后继续将字节推入每个字节。数组1会在某个时刻导致内存问题,另一个可能会停止,直到所有磁盘空间都用完为止。

答案 1 :(得分:3)

ByteArrayOutputStream将字节写入内存中的字节数组。不到任何其他目的地,例如文件或网络套接字。写入数据后,可以通过调用toByteArray()来获取字节数组。

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

为什么你可能想要使用缓冲:将大块数据写入文件系统比逐字节写入更有效。如果您的程序需要编写许多小块数据,那么首先在缓冲区中收集这些小块然后立即将整个缓冲区写入磁盘会更有效。这就是BufferedOutputStream自动为您做的事情。

答案 2 :(得分:1)

The BufferedOutputStream allows to improve performance by using buffer. When the buffer fills up, calling the write() method causes to underlying output stream write() method call, and the contents of the buffer are written to destination. The next calls of the write() method of BufferedOutputStream will store bytes in buffer until it filled again.

Usually used as wrapper, for example:

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

Thus, the number of calls of the underlying operating system functions is minimized.

The ByteArrayOutputStream allows to write the stream of bytes to the array of bytes.