【发布时间】:2021-03-17 19:52:29
【问题描述】:
我试图了解 BufferedInputStream 在这段代码中的使用。 我们这里是从inputStream写到outputStream,那么BufferedInputStream有什么意义呢?它缓冲什么,如果读取和写入的过程是逐字节发生的。
public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception {
BufferedInputStream bis = new BufferedInputStream(inputStream);
while (bis.available() > 0) {
int data = bis.read();
outputStream.write(data);
}
}
感谢您的帮助!
【问题讨论】:
-
TL;DR 通过读入更大的数据块,效率更高......底层元素以 8192(默认大小)字节的块进行交互,即使副本在一个时间(就像问题一样)。
-
因为它一次读取一个字节,如果没有缓冲区,这将非常低效。注意这是
available()的典型误用:请勿复制。它应该一直读取到流结束(read()返回 -1)或达到某个定义的长度或内容。因为它一次复制一个字节,它也应该使用BufferedOutputStream,并在完成后刷新它。更好的是,它应该使用read(byte[])和write(byte[],int,int)以及一个相当大的缓冲区,比如8k。在只是复制操作的时候调用方法executor()也是不好的做法。
标签: java