java-BufferedInputStream如何使读取操作更快?

我知道将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文件传输.服务器可能不提供“内容长度”字段.)

上一篇:java-重置BufferedInputStream保留一个FileInputStream


下一篇:【文章思路、算法分析】Membership Inference Attacks Against Machine Learning Models