我正在努力将一些文件移动到我项目中的不同目录中,并且它工作得很好,除了我无法验证它是否正常移动。
我想验证副本的长度是否与原始相同,然后我要删除原件。在我进行验证之前,我正在关闭两个FileStream,但由于尺寸不同,它仍然会失败。以下是关闭流,验证和删除的代码。
in.close();
out.close();
if (encCopyFile.exists() && encCopyFile.length() == encryptedFile.length())
encryptedFile.delete();
之前的其余代码是使用Util来复制流,它们都运行正常,所以我只需要一个更好的验证方法。
答案 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)
如果大小不同,也许您在关闭之前不会刷新输出流。
哪个文件更大?每个文件的大小是多少?你真的看过两个文件看看有什么不同吗?