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

Чем IO отличается от NIO?

MiddleВвод-вывод и NIO
Ещё спрашивают так:
  • Чем NIO отличается от классического IO и что изменили виртуальные потоки?
  • Чем NIO отличается от классического IO и что в этом сравнении изменили виртуальные потоки?
Коротко

IO (java.io) — потоки байт и символов, блокирующие: чтение держит поток, модель «поток на соединение». NIO (java.nio) — каналы и буферы, неблокирующий режим и Selector: один поток обслуживает тысячи соединений. Виртуальные потоки вернули простой блокирующий код без потери масштабируемости.

  • NIO.2 (Java 7): Files, Path, асинхронные каналы, WatchService
  • Netty, Undertow, Tomcat NIO-коннектор построены на Selector
  • Event loop усложняет код: колбэки, бесполезные стектрейсы

А ещё Files.readString и Files.lines — современный способ работать с файлами

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

Подробно

Классический IO. InputStream/OutputStream для байт, Reader/Writer для символов, обёртки-декораторы для буферизации и кодировки. read() блокирует поток до прихода данных. Сервер на 10 000 соединений = 10 000 потоков: гигабайты стеков и переключения контекста.

NIO:

  • Channel — двунаправленный канал к файлу или сокету;
  • Buffer — данные читаются в буфер и пишутся из буфера (позиция, лимит, ёмкость);
  • неблокирующий режим — read возвращает 0, если данных нет;
  • Selector — один поток спрашивает у ОС (epoll, kqueue), какие из тысяч каналов готовы, и обрабатывает только их.

Цена NIO — сложный код: состояние соединения разбросано по колбэкам, частичные чтения, ручное управление буферами. Поэтому почти все используют библиотеки (Netty) или реактивные фреймворки.

Виртуальные потоки (Java 21) убирают исходную причину: поток стал дешёвым, при блокировке он отцепляется от несущего. Можно писать простой блокирующий код «поток на соединение» и держать сотни тысяч соединений. Внутри JDK блокирующие сокеты на виртуальных потоках сами используют неблокирующий механизм.

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

  • Блокирующая модель и её предел.
  • Каналы, буферы, Selector.
  • Цена NIO и что изменили виртуальные потоки.

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

  • Считать NIO всегда быстрее для любого файла.
  • Путать java.nio.file с неблокирующим сетевым NIO.

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

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

Показать варианты и ответ
  • ✗NIO всегда медленнее IO
  • ✓IO поток-ориентирован и блокирующий; NIO буфер-ориентирован (Channel/Buffer) и умеет неблокирующий режим с Selector
  • ✗IO использует каналы и буферы, а NIO — потоки
  • ✗NIO не поддерживает работу с файлами

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

  • Что такое Channel?
  • Зачем нужен Selector?
  • Что такое pinning виртуального потока?
  • Зачем нужны прямые (direct) буферы и чем они опасны?

Разбор темы

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

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

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

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

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