Java BufferedInputStream如何使读取操作更快?

Java BufferedInputStream如何使读取操作更快?,java,bufferedinputstream,Java,Bufferedinputstream,我知道围绕FileInputStream包装BufferedInputStream会使读取操作更快,但仍在尝试 我查阅了BufferedInputStream的源代码,得到了一些东西。这是我的 理解力 InputStream in = new BufferedInpurStream(new FileInputStream(filename)); int byteToRead; while((byteToRead = in.read()) != -1) 当我在内部执行BufferedIn

我知道围绕FileInputStream包装BufferedInputStream会使读取操作更快,但仍在尝试 我查阅了BufferedInputStream的源代码,得到了一些东西。这是我的 理解力

InputStream in = new BufferedInpurStream(new FileInputStream(filename));
  int byteToRead;
  while((byteToRead = in.read()) != -1)
当我在内部执行BufferedInputStream.read()时,它将首先在缓冲区中一次读取字节块,然后 从缓冲区一个接一个地读取每个字节,而不是从文件(成本更高)中读取。一旦缓冲区为空 它将用字节块再次填充它

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


这种理解正确吗?

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

通常,read(byte[]b)(或read(byte[]b,int off,int len))比read()更受欢迎,因为它可能具有一些IO性能优势

如果使用read(byte[]b),只要使用相同的缓冲区大小,BufferedInputStream就没有任何实际优势

void read(InputStream inputStream, int bufferSize) throws IOException
{
    byte[] buffer = new byte[bufferSize];
    int read;
    while ((read = inputStream.read(buffer)) != -1)
    {
       // do some work
    }
}

尝试阅读和阅读2。您会发现,只要使用适当的缓冲区大小,包装到BufferedInputStream并不会提高性能。(实际上,这会造成另一个计算成本…)

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

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