ByteArrayOutputStream
和 BufferedOutputStream
都通过将数据放置在内存中的数组中进行缓冲。所以我的问题是:
- 这两者之间有什么区别?
- 何时使用
ByteArrayOutputStream
,何时使用BufferedOutputStream
?
由于我对此感到困惑,能否有人帮助我解决以上两个问题。
ByteArrayOutputStream
和 BufferedOutputStream
都通过将数据放置在内存中的数组中进行缓冲。所以我的问题是:
ByteArrayOutputStream
,何时使用 BufferedOutputStream
?由于我对此感到困惑,能否有人帮助我解决以上两个问题。
仅需查看Java文档:
该类实现了一个输出流,数据被写入到一个字节数组中。
该类实现了一个缓冲输出流。通过设置这样的输出流,应用程序可以将字节写入底层输出流,而不必为每个写入的字节调用底层系统。
所以,这两个东西是非常不同的:
就是这些!
如果您想体验不同的行为:创建一个写入文件的缓冲流和一个数组流。然后只需将字节推入每个流中。数组流最终会导致内存问题,而另一个流可能一直运行,直到用尽所有磁盘空间。
ByteArrayOutputStream
将字节写入内存中的字节数组,而不是写入文件或网络套接字等其他目标。在写入数据后,您可以通过调用其上的toByteArray()
来获取字节数组。
BufferedOutputStream
包装另一个底层的OutputStream
并为该底层流提供缓冲,以使I/O操作更加高效。底层流可以是任何类型的OutputStream
,例如写入文件或网络套接字的流。
为什么需要使用缓冲:将大块数据写入文件系统比逐字节写入更有效率。如果您的程序需要写入许多小数据片段,则首先将这些小片段收集到缓冲区中,然后一次性将整个缓冲区写入磁盘更加高效。这就是BufferedOutputStream
自动为您执行的操作。
BufferedOutputStream
允许使用缓冲区来提高性能。当缓冲区填满时,调用 write()
方法会导致底层输出流的 write()
方法被调用,并且缓冲区的内容被写入目标。下一次调用 BufferedOutputStream
的 write()
方法将把字节存储在缓冲区中,直到再次填满。
通常作为包装器使用,例如:
FileOutputStream fos = new FileOutputStream("file.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write( ... );
ByteArrayOutputStream
允许将字节流写入字节数组。