【问题标题】:Check Duplicate File content using Java使用 Java 检查重复文件内容
【发布时间】:2016-10-14 08:40:03
【问题描述】:

我们有一个 150 Gb 的数据文件夹。其中,文件内容是任何格式(doc、jpg、png、txt 等)。我们需要相互检查所有文件内容以检查是否有重复的文件内容。如果是,则打印文件路径名列表。为此,我首先使用ArrayList<File> 存储所有文件,然后使用FileUtils.contentEquals(file1, file2) 方法。当我尝试处理少量文件(文件夹)时,它正在工作,但对于这个 150Gb 数据文件夹,它没有显示任何结果。我认为首先将所有文件存储在 ArrayList 中会产生问题。 JVM Heap 问题,我不确定。

谁有更好的建议和示例代码来处理这么多的数据?请帮我。

【问题讨论】:

  • 您是否尝试过计算文件的校验和而不是读取它们?
  • 我直接使用 FileUtils.contentEquals 方法来检查文件以查找并存储结果。
  • @Prashant 你能给我写一个示例代码吗?
  • @samgak 已经指明了方向!请查看他的答案

标签: java algorithm collections checksum fileutils


【解决方案1】:

计算每个文件的MD5 hash,并以MD5哈希为key,文件路径为value,存储在一个HashMap中。当您向 HashMap 添加新文件时,您可以轻松检查是否已经存在具有该 MD5 哈希的文件。

错误匹配的可能性很小,但如果您愿意,可以使用 FileUtils.contentEquals 来确认匹配。

例如:

void findMatchingFiles(List<String> filepaths)
{
    HashMap<String, String> hashmap = new HashMap<String, String>();
    for(String filepath in filepaths)
    {
        String md5 = getFileMD5(filepath); // see linked answer
        if(hashmap.containsKey(md5))
        {
             String original = hashmap.get(md5);
             String duplicate = filepath;

             // found a match between original and duplicate
        }
        else
        {
             hashmap.put(md5, filepath);
        }
    }
}

如果有多个相同的文件,这将找到每个文件与第一个文件的匹配项,但不是所有文件都相互匹配。如果您想要后者,您可以将 MD5 字符串中的哈希存储到文件路径列表中,而不仅仅是存储到第一个。

【讨论】:

    【解决方案2】:

    使用 HashTable 并将文件内容的 MD5 哈希存储为键,将文件路径存储为值。 MD5 散列大小为 16 字节,与内容大小无关。因此,您的文件是否为每个 150 GB 甚至更大都没有关系。当你遇到一个新文件时,计算它的 MD5 哈希并检查它是否已经在 HashTable 中。哈希表中的查找和插入将摊销O(1)。此外,MD5 发生碰撞的可能性很小。因此,为避免误报,您可以检查文件内容以防匹配。

    注意:我写的时候没有注意到@samgak 已经给出了详细的答案。您可以使用代码 sn-p 他的答案:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2016-02-06
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多