当前位置: 首页 > 知识库问答 >
问题:

BufferedInputStream如何使读取操作更快?

袁泰
2023-03-14

我知道将BufferedInpurStream包装在FileInputStream周围会使读取操作更快,但我想知道如何做到这一点。我看了BufferedInpurStream的源代码,得到了一些东西。这是我的理解

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

当我做了这件事。read(),在内部,它将首先在缓冲区中一次读取字节块,然后从缓冲区中逐个读取每个字节,而不是从文件中读取(成本更高)。一旦缓冲区为空,它将再次用字节块填充它

而使用FileInputStream。read(),对文件中的每个字节逐个执行读取操作,这非常昂贵

这种理解正确吗?

共有2个答案

贲高寒
2023-03-14

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

牟正真
2023-03-14

通常,read(字节[]b)(或read(字节[]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
    }
}

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?以下是我的建议:

  • 如果您知道“适当”的缓冲区大小,只需直接处理它。它产生更短的代码。(例如:文件读取。您可以使用文件大小作为缓冲区大小。)
 类似资料:
  • 我正在编写一个代码,使用BufferedInputStream从用户处读取输入,但由于BufferedInputStream读取字节,我的程序只读取第一个字节并打印它。除了只读取第一个字节外,还有什么方法可以读取/存储/打印整个输入(将是整数)? 输出: [shadow@localhostcodechef]$java巨大输入测试5452 5

  • 我在一个教程中看到,BufferedInputStream类本身中的int read(字节b[],int off,int len)使用read()方法读取数据。 所以我的问题是,正常模式和不使用BufferedInputStream和使用buffer有什么区别?缓冲区应该以块的形式读取字节以降低成本,但这里它是逐字节读取。

  • 我读了这个问题:为什么使用BufferedInputStream逐个字节读取文件比使用FileInputStream更快?根据作者比更快,因为当方法在中调用时,它总是使用本地API进行系统调用,以便获取单个字节,而做同样的事情,但是它需要操作系统的字节块,并将它们存储在本地字段中,称为buf,该字段在BIS类中声明,然后当读取()被称为BIS时,返回字节从数组。 我查看了BIS的代码,特别是方法,

  • 问题内容: 我试图使用FileInputStream将文件读入数组,而一个〜800KB的文件花了大约3秒钟才能读入内存。然后,我尝试了相同的代码,只是将FileInputStream包装到BufferedInputStream中,这花费了大约76毫秒。为什么即使我仍在逐字节读取文件,使用BufferedInputStream逐字节读取文件的速度还是这么快?这是代码(其余代码完全无关)。请注意,这是

  • 问题内容: 我想优化此代码: 事情是,我不知道如何读取bufferedReader的内容并将其复制到String中,比我上面的速度更快。我需要花费尽可能少的时间。谢谢 问题答案: 在循环中使用字符串连接是 在 经典的性能杀手(因为字符串是不可变的,整个越来越大的字符串被复制为每个连接)。改为这样做:

  • 你好,虽然我读了很多其他答案,但我不明白如何关闭BufferedReader而不发送输入。这是我程序的阻塞部分: 当我从主线程调用“endListing()”时,程序终止--但不会在用户输入任何内容之前终止。我想让程序立即终止--如何启动这个BufferdReader(像BufferedReader一样创建(新的InputStreamReader(System.in))? 我试图在主线程中的这个线