Files.mismatch()
Эффективное сравнение двух файлов без загрузки их в память.
Сравнение кода
✕ Java 8
// Compare two files byte by byte byte[] f1 = Files.readAllBytes(path1); byte[] f2 = Files.readAllBytes(path2); boolean equal = Arrays.equals(f1, f2); // loads both files entirely into memory
✓ Java 12+
long pos = Files.mismatch(path1, path2); // -1 if identical // otherwise: position of first difference
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Эффективное использование памяти
Не загружает полные файлы в байтовые массивы.
Точное определение различия
Возвращает точную позицию байта первого отличия.
Один вызов
Никакой ручной логики сравнения байтовых массивов.
Старый подход
Ручное побайтовое сравнение
Современный подход
Files.mismatch()
Начиная с JDK
12
Сложность
Начинающий
Поддержка JDK
Files.mismatch()
Доступно
Доступно в JDK 12 (март 2019)
Как это работает
Files.mismatch() возвращает позицию первого отличающегося байта или -1, если файлы идентичны. Читает лениво и прерывается при первом отличии.
Связанная документация
Доказательство