Приложение читает файл через new FileReader(path) без указания кодировки. Чем это опасно?
Кодировка по умолчанию зависела от окружения (локаль ОС): одна сборка вела себя по-разному на машине разработчика и на сервере, данные молча портились. С Java 18 по умолчанию UTF-8 (JEP 400), но явная кодировка остаётся хорошей практикой.
- FileReader(path, charset) — с Java 11
- Files.readString по умолчанию UTF-8 с Java 11
- Консоль Windows по-прежнему может использовать другую кодировку
А ещё -Dfile.encoding=COMPAT вернёт старое поведение
Подробно
Исторически кодировка по умолчанию определялась локалью операционной системы, поэтому одна и та же сборка вела себя по-разному на машине разработчика и на сервере, а данные молча портились. Начиная с Java 18 кодировкой по умолчанию для файлового ввода-вывода стал UTF-8 независимо от локали, что убрало основную часть проблемы, — но полагаться на умолчание всё равно не стоит: код может выполняться на более старой версии, а явное указание документирует намерение. Правильная привычка — всегда передавать Charset: либо через перегрузку конструктора, либо через Files.newBufferedReader и Files.readString, которые используют UTF-8 по контракту. Отдельно стоит помнить, что кодировка влияет и на длину строки в байтах, что важно при валидации ограничений.
Что хотят услышать
- Почему опасно.
- Изменение Java 18.
Частые ошибки
- Полагаться на кодировку по умолчанию в коде, который поедет на другой хост.
- Считать, что переход на новую версию Java снимает необходимость указывать Charset.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗FileReader всегда читает в ASCII и портит любые не-латинские символы
- ✗Опасности нет: Java всегда использует UTF-8 во всех версиях
- ✓Кодировка по умолчанию зависит от машины и JVM, поэтому её надо задавать явно
- ✗Файл будет заблокирован до перезапуска приложения
Что спросят дальше
- Чем Files.readString удобнее ручного чтения?
- Как кодировка влияет на длину строки в байтах?
Разбор темы
- Потоки ввода-вывода: байты, символы, буферы
Байтовые и символьные потоки, кодировки и Charset, буферизация и системные вызовы, декоратор-паттерн и современный файловый API.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.