我有一段代码在循环中从本地文件系统中读取了很多(数十万)相对较小的文件(几KB)。对于每个文件,都会创建一个java.io.FileInputStream
来读取内容。这个过程很慢,需要很长时间。
您认为将FIS包装成java.io.BufferedInputStream
会产生重大影响吗?
答案 0 :(得分:9)
如果您还没有在读/写循环中使用大小合适的byte[] buffer
(BufferedInputStream
的最新实现使用8KB),那么肯定会有所作为。亲自尝试一下。不要忘记任何OutputStream
一个BufferedOutputStream
。
但是如果你已经使用byte[]
缓冲它和/或它毕竟只有很小的差别,那么你已经将硬盘和I / O控制器速度作为瓶颈。
答案 1 :(得分:3)
我非常怀疑这是否会产生任何影响。
你的根本问题是数以百计的小文件。阅读这些将使磁盘捶打并永远消失,无论你如何操作,你将花99,9%的时间等待硬盘内的机械运动。
有两种方法可以解决这个问题:
答案 2 :(得分:3)
这取决于您如何阅读数据。如果您以非常低效的方式从FileInputStream中读取(例如,逐字节调用read()),那么使用BufferedInputStream可以显着改善事物。但是如果你已经在FileInputStream中使用了合理大小的缓冲区,那么切换到BufferedInputStream并不重要。
由于您正在谈论大量非常小的文件,因此很可能很多延迟是由于目录操作(打开,关闭),而不是文件中实际读取的字节数。