首页 > 解决方案 > 我什么时候使用 BufferedInputStream?

问题描述

为什么我用 BufferedInputStream 包装 FileInputStream 并使用read(byte[20])并让 BufferedInputStream 在内部缓冲 8192 字节以获得性能优势?

相反,我可以使用fileInputStream.read(byte[8192])对吗?现在,我从不需要使用 BufferedInputStream。

我什么时候使用 BufferedInputStream?我错过了什么吗?当我可以通过 FileInputStream 的大读取获得更好的性能优势时,我从不希望进行较小的读取。在什么情况下,一次读取 20 个字节的小数据?

标签: javafile-ioinputstreamfileinputstreambufferedinputstream

解决方案


你没有。

BufferedInputStream当以下两件事都为真时才是有用的构造:

  • 底层输入流(您传递给BufferedInputStream构造函数的输入流)使得小型读取效率低下(例如,在达到一定的大尺寸时,所有读取都需要相同的时间,因此小型读取效率低下)。这往往适用于文件,有时适用于网络流。
  • 实际上,您打算进行少量阅读。

如果您的代码设置为一次可以读取一个缓冲区负载,那就太好了。不要打扰 BufferedInputStream。这并不总是正确的。例如,如果您正在编写一些简单的二进制格式阅读器,那么您往往会进行大量的小读取。(通常,.read(),最多只能读取一个字节)。

请注意,.read(byte[])很难使用:如果将 8192 大小的字节数组传递给此方法,则不必读取所有 8192 字节,即使有 8192 字节要读取:该方法将读取最佳字节数,至少保证1 字节读取(或 0 字节读取和返回值 -1,表示流结束,或者当然是例外),但它不保证最大读取,这使得除了基本“blit”之外的几乎所有读取作业都变得复杂操作(您只需阅读所有内容并将其直接复制到其他内容中)。

如果您正在执行复制操作,请注意存在in.transferTo(out)- 单行,您甚至不必制作缓冲区,并且将尽可能高效。

还有.readNBytes.readFully如果你需要保证尽可能多的字节可以读取,被读取。


推荐阅读