Как найти первое различие двух файлов через Files.mismatch в Java

Как найти первое различие двух файлов через Files.mismatch в Java
Содержание статьи

Для побайтового сравнения файлов в Java есть Files.mismatch, доступный с Java 12. Он возвращает позицию первого несовпадения либо -1L. В разборе Mentoring.digital важно правильно прочитать этот результат и не спутать его с проверкой существования файлов.

Что возвращает метод

Метод принимает два Path. Ноль означает несовпадение в начале содержимого, в том числе случай пустого и непустого файла. Если короткий файл целиком совпадает с началом длинного, результатом будет размер короткого файла в байтах.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

final class CompareFiles {
    static String compare(Path first, Path second)
            throws IOException {
        long offset = Files.mismatch(first, second);
        return offset == -1L
            ? "Содержимое совпадает"
            : "Первое различие в байте " + offset;
    }
}

Вызов выполняется для выбранных файлов, к которым у процесса есть доступ. Ошибку чтения нельзя превращать в сообщение о совпадении: метод объявляет IOException.

Байтовая позиция не является номером строки

Сравнение касается содержимого в байтах. Разные кодировки, BOM или окончания строк могут дать несовпадение даже при похожем отображении текста. По возвращённой позиции нельзя сразу назвать номер символа или строки.

Сначала определите требуемый критерий: точная идентичность файла или равенство текста после явно согласованных преобразований. Это разные задачи. Для побайтовой проверки не нужно предварительно перекодировать данные.

Одинаковые пути и меняющиеся файлы

По контракту метода два равных объекта Path дают результат без проверки существования файла. Поэтому -1L сам по себе не заменяет проверку того, что независимые входные файлы были выбраны правильно.

Операция также не обязана быть атомарной относительно других действий файловой системы. Для воспроизводимого результата сравнивайте файлы, которые не меняются во время чтения. В учебной проверке отдельно рассмотрите равные файлы, различие первого байта, общий префикс и ошибку доступа.

Файловые API изучают на курсах Java. Сопоставить байтовую проверку с требованиями своего приложения поможет наставник по Java.

Похожие статьи по данной теме