比较Java

时间:2017-11-30 18:10:54

标签: java checksum file-comparison

目前我们有一个夜间自动化运行,可以对我们软件生成的测试文件和基线文件进行比较。这种比较已经完成了几次并且文件很大。文件比较是我们测试自动化的瓶颈。

目前通过逐行缓冲缓冲来完成文件比较。

我正在考虑对两个文件进行校验和比较(然后逐行检查校验和是否匹配)。这是最好的方法吗?是否有人想建议的公共图书馆?

由于

1 个答案:

答案 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()是最耗时的操作,所以最后一次读取就是这样。

BTW:代码只是一个想法。真正的代码必须更加小心,特别是“最后阅读”,绝对可以更优化。