java - 验证文件是否已在 Java 中复制

标签 java copy filestream verification

我正在努力将一些文件移动到项目中的不同目录,它运行良好,但我无法验证它是否已正确移动。

我想验证副本的长度与原始文件的长度相同,然后我想删除原始文件。我在进行验证之前关闭了两个 FileStream,但由于大小不同,它仍然失败。下面是我的关闭流、验证和删除的代码。

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

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

在此之前的其余代码使用 Util 来复制流,并且一切正常,所以我实际上只需要一个更好的验证方法。

最佳答案

一个很好的检查方法是比较 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();
        }
    }
}

关于java - 验证文件是否已在 Java 中复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4628769/

相关文章:

SQL Server FileStream - 如何获取文件路径

c# - 在 Stream 中读取多个文件

java - BeanUtils copyProperties 复制Arraylist

java - 如何在 JSP 文件中为导入的包添加别名?

java - 如何将以下基于 xml 的 spring bean 转换为基于 java 注释的 bean?

java - Java 什么时候需要显式类型参数?

java - 复制目录不会复制源文件夹 Java

Excel 2007 - 工作表之间的宏复制和粘贴,到新行

javascript - p2p文件下载中node.js写入文件流无序

java - 不同字符串的 UUID 相同