什么时候使用 BufferedInputStream?

When would I use BufferedInputStream?

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

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

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

你不知道。

BufferedInputStream 是一个有用的构造 如果两者 以下两点为真:

  • 底层输入流(您传递给 BufferedInputStream 构造函数的输入流)使得小读取效率低下(例如,达到某个 large-ish 大小,所有读取都采用同时,所以小读取是低效的)。这往往适用于文件,有时也适用于网络流。
  • 事实上,您打算进行小规模阅读。

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

请注意 .read(byte[]) 很难使用:如果将 8192 大小的字节数组传递给此方法,您 不必读入所有 8192 字节,即使如果有 8192 个要读取:该方法将读取最佳字节数,保证至少读取 1 个字节(或读取 0 个字节且 return 值为 -1,表示 end-of-stream,或异常当然),但它不能保证最大读取量,这会使几乎所有读取作业都变得复杂,除了基本的 'blit' 操作(您只需读取所有内容并将其直接复制到其他东西中)。

如果你正在做复制的事情,请注意 in.transferTo(out) 存在 - 一个单行,你甚至不需要做一个缓冲区,并且会尽可能地高效.

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