gpt4 book ai didi

java - BufferedInputStream 如何让读操作更快?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:49 26 4
gpt4 key购买 nike

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

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

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

而使用 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 如何让读操作更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17473863/

26 4 0
文章推荐: android - 如何像 soundcloud android 应用程序一样通过向上/向下滑动来显示/隐藏 fragment
文章推荐: java - 从 Java Play Framework 2.0 List 生成/导出 excel 文件