【发布时间】:2011-05-25 06:42:07
【问题描述】:
在 Java 第 4 版中阅读思维。我对 I/O 操作性能有一些疑问: 我读过最好在 BufferedInputStream 中“包装”InputStream 对象,但在我看来,我看不出有什么区别。即文件操作不是已经缓冲了吗?文件缓冲写有什么好处?
【问题讨论】:
-
嗯,这就是我最初的想法。但是如果 InputStream 读取一个字节,包装类 BufferedInputStream 应该从包装的 InputStream 调用 InputStream.read
次,导致 访问磁盘,不是吗? -
我认为您误解了
InputStreamAPI。它有三个名为read的方法。其中两种方法允许批量操作(在byte[]数组上)。在内部,BufferedInputStream保留一个byte[]数组作为其缓冲区。它将使用其他InputStream的批量方法填充其缓冲区,从而最大限度地减少调用次数。因此,如果您正在读取一个 500 字节的文件,而BufferedInputStream正在缓冲 100 字节,则另一个InputStream的批量read方法将被调用 5 次。 -
@Adam Paynter:好的。这才是重点。通过 5 次调用 InputStream.read(byte[100]) 或使用 BufferedInputStream(InputStream, 100) 5 次调用 InputStream.read(byte[100]) 读取 500 字节文件是否具有相同的行为?
-
如果
BufferedInputStream实际上是缓冲 100 个字节那么你是对的,没有区别。如果您想要一次消耗小于 100 个的块中的字节,它可以提供优势。理论上,您可以一次使用一个字节的 500 字节文件,但BufferedInputStreamStream将确保只进行 5 次系统调用。 -
好吧……正如作者不断重复的那样,包装到 BufferedInputStream 始终是正确的选择,我认为它会做一些特殊的优化。谢谢回复,再见:)