目前我们有一个夜间自动化运行,可以对我们软件生成的测试文件和基线文件进行比较。这种比较已经完成了几次并且文件很大。文件比较是我们测试自动化的瓶颈。
目前通过逐行缓冲缓冲来完成文件比较。
我正在考虑对两个文件进行校验和比较(然后逐行检查校验和是否匹配)。这是最好的方法吗?是否有人想建议的公共图书馆?
由于
答案 0 :(得分:1)
10 ms是否足以比较两个260K文件? (在Windows笔记本电脑上)
如果是这样,您可以使用java.security.DigestInputStream
来计算和比较哈希。
当然要做,请检查文件长度。 如果问题涉及您需要比较的许多文件,请考虑使用并行线程来比较每对。
示例代码:
public static void main(String[] args) {
try {
File file1 = new File("D:\\tmp\\tests\\logs\\test.log");
File file2 = new File("D:\\tmp\\tests\\logs\\test-cp.log");
if (!file1.exists() || !file2.exists()) {
System.out.println("One of the file not found.");
return;
}
if (file1.length() != file2.length()) {
System.out
.println("Files are not identical - not equal length.");
return;
}
long f1Length = file1.length();
long f2Length = file2.length();
System.out.println("Check Digest method:");
FileInputStream fis1 = new FileInputStream(file1);
DigestInputStream dgStream1 = new DigestInputStream(fis1,
MessageDigest.getInstance("MD5"));
FileInputStream fis2 = new FileInputStream(file2);
DigestInputStream dgStream2 = new DigestInputStream(fis2,
MessageDigest.getInstance("MD5"));
// most expensive is dgStream1.getMessageDigest() so do it only at last read
dgStream1.on(false);
dgStream2.on(false);
long f1ReadTotal = 0;
long f2ReadTotal = 0;
long start = System.nanoTime();
int read = 0;
byte[] buff = new byte[1024 * 128];
do {
if ((f1Length - f1ReadTotal) < (1024 * 128)) {
// last read
dgStream1.on(true);
}
read = dgStream1.read(buff);
f1ReadTotal += read > 0 ? read : 0;
} while (read > 0);
read = 0;
do {
if ((f2Length - f2ReadTotal) < (1024 * 128)) {
// last read
dgStream2.on(true);
}
read = dgStream2.read(buff);
f2ReadTotal += read > 0 ? read : 0;
} while (read > 0);
long runTime = System.nanoTime() - start;
if (Arrays.equals(dgStream1.getMessageDigest().digest(), dgStream2
.getMessageDigest().digest())) {
System.out.println("Files are identical. completed in "
+ (runTime / 1000000) + " ms. [" + runTime + " ns.]");
} else {
System.out.println("Files are not identical. completed in "
+ (runTime / 1000000) + " ms. [" + runTime + " ns.]");
}
fis1.close();
fis2.close();
} catch (Exception e) {
e.printStackTrace();
}
}
主要观点是getMessageDigest()
是最耗时的操作,所以最后一次读取就是这样。