验证文件是用Java复制的

时间:2011-01-07 18:10:17

标签: java copy filestream verification

我正在努力将一些文件移动到我项目中的不同目录中,并且它工作得很好,除了我无法验证它是否正常移动。

我想验证副本的长度是否与原始相同,然后我要删除原件。在我进行验证之前,我正在关闭两个FileStream,但由于尺寸不同,它仍然会失败。以下是关闭流,验证和删除的代码。

 in.close();
 out.close();

 if (encCopyFile.exists() && encCopyFile.length() == encryptedFile.length())
     encryptedFile.delete();

之前的其余代码是使用Util来复制流,它们都运行正常,所以我只需要一个更好的验证方法。

5 个答案:

答案 0 :(得分:4)

您可以检查的一个很棒的方法是比较md5哈希值。检查文件长度并不意味着它们是相同的。虽然md5哈希并不意味着它们也是相同的,但它比检查长度更好,尽管过程更长。

public class Main {

    public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
        System.out.println("Are identical: " + isIdentical("c:\\myfile.txt", "c:\\myfile2.txt"));
    }

    public static boolean isIdentical(String leftFile, String rightFile) throws IOException, NoSuchAlgorithmException {
        return md5(leftFile).equals(md5(rightFile));
    }

    private static String md5(String file) throws IOException, NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        File f = new File(file);
        InputStream is = new FileInputStream(f);
        byte[] buffer = new byte[8192];
        int read = 0;
        try {
            while ((read = is.read(buffer)) > 0) {
                digest.update(buffer, 0, read);
            }
            byte[] md5sum = digest.digest();
            BigInteger bigInt = new BigInteger(1, md5sum);
            String output = bigInt.toString(16);
            return output;
        } finally {
            is.close();
        }
    }
}

答案 1 :(得分:3)

你可以使用commons io:

org.apache.commons.io.FileUtils.contentEquals(File file1, File file2) 

或者您可以使用校验和方法:

org.apache.commons.io.FileUtils:
static Checksum checksum(File file, Checksum checksum) //Computes the checksum of a file using the specified checksum object.
static long checksumCRC32(File file) //Computes the checksum of a file using the CRC32 checksum routine.

答案 2 :(得分:3)

如果在复制流时没有异常,那么你应该没问题。确保不要忽略close方法引发的异常!

更新:如果您使用FileOutputStream,您还可以在关闭fileOutputStream.getFD().sync()之前致电fileOutputStream确保所有内容都已正确写入。

当然,如果你想绝对确保文件是相同的,你可以比较他们的校验和/摘要,但这听起来有点偏执。

答案 3 :(得分:2)

您可以在复制操作中包含校验和。对目标文件执行校验和,并查看它与源上的校验和匹配。

答案 4 :(得分:1)

如果大小不同,也许您在关闭之前不会刷新输出流。

哪个文件更大?每个文件的大小是多少?你真的看过两个文件看看有什么不同吗?