BufferedInputStream如何使读取操作更快?

时间:2013-07-04 15:27:00

标签: java bufferedinputstream

我知道在FileInputStream周围包装BufferedInpurStream会使读取操作更快但尝试   弄清楚如何。我查看了BufferedInpurStream的源代码并得到了一些东西。这是我的   理解

InputStream in = new BufferedInpurStream(new FileInputStream(filename));
  int byteToRead;
  while((byteToRead = in.read()) != -1)

当我执行bufferedInpurStream.read()时,它会在内部首先读取一大块字节到缓冲区然后   从缓冲区逐个读取每个字节,而不是从文件中读取它(这是更昂贵的)。一旦缓冲区为空   它会用大块的字节填充它

使用FileInputStream.read()时,从文件中逐个执行每个字节的读取操作,这是非常昂贵的

这种理解是否正确?

2 个答案:

答案 0 :(得分:3)

通常,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。你会发现,只要你使用适当的缓冲区大小,Wlappping到BufferedInputStream就不会改善性能。 (实际上它会产生另一种计算成本......)

那么,你什么时候需要BufferedInputStream? 这是我的建议:

  • 如果你知道“适当的”缓冲区大小,只需直接处理它。它产生更短的代码。 (例如:文件读取。您可以使用文件大小作为缓冲区大小。)
  • 如果您不知道“适当的”缓冲区大小,或者您必须将InputStream传递给另一个库,请将该流包装为BufferedInputStream。 你可以从缓冲中受益。 (例如:Web文件传输。服务器可能不提供内容长度字段。)

答案 1 :(得分:0)

是。如您所述,BufferedInputStream极大地减少了从流中一次读取一个字节时所进行的IO调用次数(因为大多数read()调用都会访问缓冲区)。