我有一段代码需要读取大量(数十万)相对较小的文件(几KB),并在循环中从本地文件系统中读取。对于每个文件都创建了java.io.FileInputStream
以读取内容。这个过程非常缓慢,需要很长时间。
您认为将FIS封装到java.io.BufferedInputStream
中是否会有显着的差异?
我有一段代码需要读取大量(数十万)相对较小的文件(几KB),并在循环中从本地文件系统中读取。对于每个文件都创建了java.io.FileInputStream
以读取内容。这个过程非常缓慢,需要很长时间。
您认为将FIS封装到java.io.BufferedInputStream
中是否会有显着的差异?
如果你在读写循环中没有使用一个合适大小的byte[]缓冲区
(最新的BufferedInputStream
实现使用8KB),那么它肯定会产生影响。自己试一下,不要忘记将任何OutputStream
也改为BufferedOutputStream
。
但是,如果你已经使用了byte[]缓冲区
进行了缓存,但是仍然只能获得少量的效果,那么你已经达到了硬盘和I/O控制器速度的瓶颈。
我非常怀疑这会有任何区别。
你的根本问题是数十万个小文件。不管你如何操作,读取它们都会让硬盘疯狂转动并且需要很长时间,你将花费99.9%的时间等待硬盘内部机械移动。
有两种方法可以解决这个问题: