Чем IO отличается от 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 — современный способ работать с файлами
Подробно
Классический 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
- ✗NIO не поддерживает работу с файлами
- ✓IO — блокирующие потоки; NIO — каналы и буферы с неблокирующим режимом
- ✗IO использует каналы и буферы, а NIO — потоки байтов с обязательной блокировкой
Что спросят дальше
- Что такое Channel?
- Зачем нужен Selector?
- Что такое pinning виртуального потока?
- Зачем нужны прямые (direct) буферы и чем они опасны?
Разбор темы
- Потоки ввода-вывода: байты, символы, буферы
Байтовые и символьные потоки, кодировки и Charset, буферизация и системные вызовы, декоратор-паттерн и современный файловый API.
- NIO: каналы, буферы и неблокирующий ввод-вывод
io против nio, Channel и ByteBuffer с его flip/clear, Selector и event loop, влияние виртуальных потоков и NIO.2.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.