Учитывая, что два файла равны, если они имеют одинаковое расширение и одинаковый размер файла, это просто вопрос создания объекта, который представляет это «равенство».Итак, вы бы сделали что-то вроде:
public class FileEquality {
private final String fileExtension;
private final long fileSize;
// constructor, toString, equals, hashCode, and getters here.
}
(и заполните все недостающие шаблоны: Constructor, toString, equals, hashCode и getters. См. Project Lombok's @ Value toсделай это легко, если хочешь).Вы можете получить расширение файла по имени файла, используя fileName.lastIndexOf('.')
и fileName.substring(lastIndex)
.С lombok все, что вам нужно написать:
@lombok.Value public class FileEquality {
String fileExtension;
long fileSize;
}
Затем используйте FileEquality
объекты в качестве ключей в вашей хэш-карте вместо строк.Однако то, что у вас есть, скажем, «foo.txt» и «bar.txt», размер которых составляет 500 байт, не означает, что эти 2 файла являются дубликатами.Итак, вы тоже хотите, чтобы контент включался, но, если вы расширите свой класс FileEquality
, чтобы включить содержимое файла, то появятся 2 вещи:
Если вы проверяете контентв любом случае, какое значение имеет размер и расширение файла?Если содержимое foo.txt
и bar.jpg
одинаково, они дубликаты, нет?Зачем беспокоиться.Вы можете передать содержимое как byte[]
, но обратите внимание, что написание правильной реализации hashCode()
и equals()
(которая требуется, если вы хотите использовать этот объект в качестве ключа для хэш-карт) становится немного сложнее.К счастью, @Value
от lombok все поймет правильно, поэтому я предлагаю вам использовать это.
Это означает, что полнота содержимого файла находится в памяти процесса вашей JVM,Если вы не проверяете очень маленькие файлы, вам просто не хватит памяти.Вы можете несколько абстрагироваться от этого, не сохраняя весь контент файла, а сохраняя хэш контента.Google вокруг, как вычислить sha-256 хеш файла в Java.Поместите это значение в ваш FileEquality
, и теперь вы избежите проблемы с памятью.Теоретически возможно иметь 2 файла с разным содержимым, которые, тем не менее, хэшируют с одинаковым значением sha-256, но вероятность этого астрономическая, и, более того, sha-256 разработан таким образом, что его невозможно математически преднамеренносделайте 2 таких файла, чтобы связываться с вашим приложением.Поэтому я предлагаю вам просто доверять хешу:)
Обратите внимание, конечно, что хеширование всего файла требует чтения всего файла, поэтому, если вы запускаете поиск дубликатов в каталоге, содержащемскажем, файлы объемом 500 ГБ, тогда вашему приложению потребуется минимальное чтение 500 ГБ, что займет некоторое время.