ByteArrayOutputStream
和BufferedOutputStream
都通过将数据放入内存中的数组来进行缓冲。所以我的问题是
ByteArrayOutputStream
以及何时使用BufferedOutputStream
有些人可以帮我解决上面两个问题,因为我对此感到困惑。
答案 0 :(得分:4)
看看javadoc:
此类实现一个输出流,其中数据被写入字节数组。
该类实现缓冲输出流。通过设置这样的输出流,应用程序可以将字节写入基础输出流,而不必为每个写入的字节调用底层系统。
所以,那些是非常不同的东西:
这就是全部!
如果您想体验不同的行为:创建一个写入文件的缓冲区和一个阵列。然后继续将字节推入每个字节。数组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.