Получить доступ

Приложение читает файл через new FileReader(path) без указания кодировки. Чем это опасно?

MiddleВвод-вывод и NIO
Коротко

Кодировка по умолчанию зависела от окружения (локаль ОС): одна сборка вела себя по-разному на машине разработчика и на сервере, данные молча портились. С Java 18 по умолчанию UTF-8 (JEP 400), но явная кодировка остаётся хорошей практикой.

  • FileReader(path, charset) — с Java 11
  • Files.readString по умолчанию UTF-8 с Java 11
  • Консоль Windows по-прежнему может использовать другую кодировку

А ещё -Dfile.encoding=COMPAT вернёт старое поведение

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Исторически кодировка по умолчанию определялась локалью операционной системы, поэтому одна и та же сборка вела себя по-разному на машине разработчика и на сервере, а данные молча портились. Начиная с Java 18 кодировкой по умолчанию для файлового ввода-вывода стал UTF-8 независимо от локали, что убрало основную часть проблемы, — но полагаться на умолчание всё равно не стоит: код может выполняться на более старой версии, а явное указание документирует намерение. Правильная привычка — всегда передавать Charset: либо через перегрузку конструктора, либо через Files.newBufferedReader и Files.readString, которые используют UTF-8 по контракту. Отдельно стоит помнить, что кодировка влияет и на длину строки в байтах, что важно при валидации ограничений.

Что хотят услышать

  • Почему опасно.
  • Изменение Java 18.

Частые ошибки

  • Полагаться на кодировку по умолчанию в коде, который поедет на другой хост.
  • Считать, что переход на новую версию Java снимает необходимость указывать Charset.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Используется кодировка по умолчанию, которая может отличаться между машинами: тот же код прочитает файл по-разному — кодировку следует задавать явно
  • ✗FileReader всегда читает в ASCII и портит любые не-латинские символы
  • ✗Опасности нет: Java всегда использует UTF-8 во всех версиях
  • ✗Файл будет заблокирован до перезапуска приложения

Что спросят дальше

  • Чем Files.readString удобнее ручного чтения?
  • Как кодировка влияет на длину строки в байтах?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем