我在硬盘上有两个文件,每个文件容量为2GB,想要将它们相互比较:
- 使用Windows资源管理器进行复制需要大约2-4分钟(即读取和写入 - 在同一物理和逻辑磁盘上)。
- 使用
java.io.FileInputStream
读取两次,再逐字节比较字节数组需要20多分钟。 java.io.BufferedInputStream
的缓冲区为64kb,文件被分块读取后进行比较。比较是在一个紧密循环中完成的,例如:
我该怎么做才能加快速度? NIO是否比普通流更快? Java是否无法使用DMA / SATA技术,而是使用一些慢速的操作系统API调用?int numRead = Math.min(numRead[0], numRead[1]); for (int k = 0; k < numRead; k++) { if (buffer[1][k] != buffer[0][k]) { return buffer[0][k] - buffer[1][k]; } }
编辑:感谢答案。我进行了一些基于它们的实验。正如Andreas所示,流或NIO方法没有太大区别。更重要的是正确的缓冲区大小。
我的实验证实了这一点。由于文件以大块读取,即使使用附加缓冲区(BufferedInputStream),也不会有任何效果。优化比较可能,我使用32倍展开获得最佳结果,但与磁盘读取相比,比较时间很短,因此加速很小。看来我没什么可做的了;-(