Проверяем UTF-8 импорт!
При чтении выгрузки некорректная последовательность байтов может незаметно превратиться в символ замены. Настроим строгий декодер и будем обрабатывать файл построчно, не загружая его целиком.
Сразу задаём правило для повреждённых байтов:
var decoder = StandardCharsets.UTF_8.newDecoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
REPO{}
RT заставляет чтение завершиться ошибкой при неверном UTF-8 вместо подстановки символа. Это важно для импорта идентификаторов, контрольных данных и файлов.Оборачиваем байтовый поток в символьный и читаем строки последовательно:
try (v
ar reader = new BufferedReader(new InputStreamReader(
Files.newInputStream(path), decoder))) {
for (String line; (line = reader.readLine()) != null; ) importLine(line);
}
InputStreamRea{}
der сохраняет состояние между чтениями, поэтому многобайтовый символ корректно собирается даже на границе внутренних буферов. try-with-resources закрывает файл при завершении и при исключении.Повреждённый ввод отделяем от ошибок бизнес-обработки:
try {
readImpor
t(path);
} catch (CharacterCodingException error) {
reportInvalidEncoding(path);
}
Так импорт сохраняет{}
строгую проверку кодировки и расходует память пропорционально буферу и одной строке, а не всему файлу.👉 Java Ready | практика