缓冲FileInputStream怎么样?

时间:2010-05-21 12:40:47

标签: java file-io

我有一段代码在循环中从本地文件系统中读取了很多(数十万)相对较小的文件(几KB)。对于每个文件,都会创建一个java.io.FileInputStream来读取内容。这个过程很慢,需要很长时间。

您认为将FIS包装成java.io.BufferedInputStream会产生重大影响吗?

3 个答案:

答案 0 :(得分:9)

如果您还没有在读/写循环中使用大小合适的byte[] bufferBufferedInputStream的最新实现使用8KB),那么肯定会有所作为。亲自尝试一下。不要忘记任何OutputStream一个BufferedOutputStream

但是如果你已经使用byte[]缓冲它和/或它毕竟只有很小的差别,那么你已经将硬盘和I / O控制器速度作为瓶颈。

答案 1 :(得分:3)

我非常怀疑这是否会产生任何影响。

你的根本问题是数以百计的小文件。阅读这些将使磁盘捶打并永远消失,无论你如何操作,你将花99,9%的时间等待硬盘内的机械运动。

有两种方法可以解决这个问题:

  • 将数据保存在SSD上 - 它们的延迟要低得多(减少五个数量级)。
  • 将您的数据重新排列为几个大文件并按顺序读取

答案 2 :(得分:3)

这取决于您如何阅读数据。如果您以非常低效的方式从FileInputStream中读取(例如,逐字节调用read()),那么使用BufferedInputStream可以显着改善事物。但是如果你已经在FileInputStream中使用了合理大小的缓冲区,那么切换到BufferedInputStream并不重要。

由于您正在谈论大量非常小的文件,因此很可能很多延迟是由于目录操作(打开,关闭),而不是文件中实际读取的字节数。