如何比较两个文件看它们是否相同?
How to compare two files to see if they are the same?
我以前以为可以使用校验和(MD5或CRC32)来改进上传方式。也就是说,如果文件校验和相同,我认为它是同一个文件。但是有一天我看到 org.apache.commons.io.FileUtils
中的代码,其中包含两个方法 contentEquals
和 contentEqualsIgnoreEOL
。有两种方法可以检查同一个文件。
if (file1.getCanonicalFile().equals(file2.getCanonicalFile())) {
// same file
return true;
}
和
IOUtils.contentEquals(new FileInputStream(f1), new FileInputStream(f2));
以下是让我困惑的地方。
- 我无法获得有关
canonical
的足够信息。这是什么意思?
- 它使用 IO 流来检查文件而不是校验和。
那么,在什么情况下我应该使用字节或校验和来检查同一个文件。
- 第一个检查文件路径以查看两个文件是否引用同一个文件。
- 第二次检查完整文件,看文件内容是否相同。
校验和
- 如果两个校验和不同,您可以自信地说文件不同。
- 如果两个校验和相等,则不能确定文件相同。
通过预先缓存每个文件的校验和,可以使用校验和进行快速检查。
我以前以为可以使用校验和(MD5或CRC32)来改进上传方式。也就是说,如果文件校验和相同,我认为它是同一个文件。但是有一天我看到 org.apache.commons.io.FileUtils
中的代码,其中包含两个方法 contentEquals
和 contentEqualsIgnoreEOL
。有两种方法可以检查同一个文件。
if (file1.getCanonicalFile().equals(file2.getCanonicalFile())) {
// same file
return true;
}
和
IOUtils.contentEquals(new FileInputStream(f1), new FileInputStream(f2));
以下是让我困惑的地方。
- 我无法获得有关
canonical
的足够信息。这是什么意思? - 它使用 IO 流来检查文件而不是校验和。
那么,在什么情况下我应该使用字节或校验和来检查同一个文件。
- 第一个检查文件路径以查看两个文件是否引用同一个文件。
- 第二次检查完整文件,看文件内容是否相同。
校验和
- 如果两个校验和不同,您可以自信地说文件不同。
- 如果两个校验和相等,则不能确定文件相同。
通过预先缓存每个文件的校验和,可以使用校验和进行快速检查。