Java 如何比较两个文件以确定它们是否相同?

Java 如何比较两个文件以确定它们是否相同?,java,file-handling,fileinputstream,Java,File Handling,Fileinputstream,我曾经认为我可以使用校验和(MD5或CRC32)来改进上传方法。也就是说,如果文件校验和相同,我认为它是同一个文件。但是有一天我在org.apache.commons.io.FileUtils中看到了代码,其中包含两个方法contentEquals和contentEqualsIgnoreEOL。检查同一文件有两种方法 if (file1.getCanonicalFile().equals(file2.getCanonicalFile())) { // same file

我曾经认为我可以使用校验和(MD5或CRC32)来改进上传方法。也就是说,如果文件校验和相同,我认为它是同一个文件。但是有一天我在
org.apache.commons.io.FileUtils
中看到了代码,其中包含两个方法
contentEquals
contentEqualsIgnoreEOL
。检查同一文件有两种方法

if (file1.getCanonicalFile().equals(file2.getCanonicalFile())) {  
        // same file  
        return true;  
    } 

下面是让我困惑的

  • 我无法获得有关
    canonical
    的足够信息。这是什么意思
  • 它使用IO流来检查文件,而不是校验和
那么,在哪种情况下我应该使用字节或校验和来检查同一个文件呢

if (file1.getCanonicalFile().equals(file2.getCanonicalFile())) {  
        // same file  
        return true;  
    } 
  • 第一个检查文件路径,查看两个文件是否引用同一个文件
  • 第二步是检查完整的文件,看看文件的内容是否相同
  • 校验和

  • 如果两个校验和不同,您可以自信地说文件不同
  • 如果两个校验和相等,您不能自信地说文件是相同的

  • 校验和可用于通过预先缓存每个文件的校验和进行快速检查。

    MD5在某些情况下可能会发生冲突。然而,在大多数情况下,这是好的。为了更好地避免冲突,您可以使用其他哈希系统。我们在所有的文件传输中都使用校验和,因为能够随文件一起发送校验和是件好事,并且允许在远程系统上进行独立验证。(1)解析文件路径的真实位置;如果将两个符号链接的文件传递给同一个文件,则没有必要进行进一步测试。它们是同一个真实的文件。(2) 要计算MD5或CRC32,必须读取这两个文件并执行数学运算。如果你无论如何都在读这两本书,那么你最好一步一步地读,边读边比较。这样做的好处是,它可以在第一个差异处短路(如果有)。