我知道将BufferedInpurStream包裹在FileInputStream周围可以使读取操作更快,但是尝试
我去看了BufferedInpurStream的源代码并得到了一些东西.这是我的
理解
InputStream in = new BufferedInpurStream(new FileInputStream(filename));
int byteToRead;
while((byteToRead = in.read()) != -1)
当我执行bufferedInpurStream.read()时,在内部,它将首先一次读取字节块以进入缓冲区,然后
从缓冲区中逐个读取每个字节,而不是从文件中读取(更昂贵).一旦缓冲区为空
它将再次用字节块填充它
而使用FileInputStream.read()时,对文件中的每个字节逐个执行读取操作,这是非常昂贵的
这种理解正确吗?
解决方法:
通常,read(byte [] b)(或read(byte [] b,int off,int len))比read()更可取,因为它可能具有一些IO性能优势.
而且,如果您使用read(byte [] b),则只要使用相同的缓冲区大小,BufferedInpurStream就没有任何实际优势.
void read(InputStream inputStream, int bufferSize) throws IOException
{
byte[] buffer = new byte[bufferSize];
int read;
while ((read = inputStream.read(buffer)) != -1)
{
// do some work
}
}
和
void read2(InputStream inputStream, int bufferSize) throws IOException
{
BufferedInputStream bis = new BufferedInputStream(inputStream, bufferSize);
try
{
byte[] buffer = new byte[bufferSize];
int read;
while ((read = bis .read(buffer)) != -1)
{
// do some work
}
}
finally
{
bis.close();
}
}
尝试阅读和阅读2.您会发现,只要使用适当的缓冲区大小,将结果包装到BufferedInputStream不会提高性能. (实际上,这会带来另外的计算成本…)
那么,什么时候需要BufferedInputStream?
这是我的建议:
>如果您知道“适当的”缓冲区大小,请直接处理它.它产生较短的代码.
(例如:文件读取.您可以将文件大小用作缓冲区大小.)
>如果您不知道“合适的”缓冲区大小,或者必须将InputStream传递给另一个库,则将流包装为BufferedInputStream.
您可能会受益于缓冲. (例如:Web文件传输.服务器可能不提供“内容长度”字段.)