Является ли Java NIO (New I/O) поток-ориентированным (stream-oriented)?

«Является ли Java NIO (New I/O) поток-ориентированным (stream-oriented)?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, Java NIO — это не поток-ориентированная модель. Она основана на буферах (buffers) и каналах (channels), что является блочно-ориентированной (block-oriented) или буфер-ориентированной моделью.

Сравнение с классическим IO (java.io): Аспект Классический IO (Stream-oriented) NIO (Buffer-oriented)
Основная единица Поток байтов/символов (stream) Буфер (buffer)
Блокировка Блокирующие операции (по умолчанию) Неблокирующие операции (опционально)
Мультиплексирование Требует много потоков Один поток (селектор) может управлять множеством каналов

Пример неблокирующего чтения с NIO:

SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false); // Включаем неблокирующий режим
channel.connect(new InetSocketAddress("example.com", 80));

// Пока соединение устанавливается, поток не блокируется
while (!channel.finishConnect()) {
    // Можно выполнять другую работу
}

ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = channel.read(buffer); // Возвращает 0, если данных нет

Ключевые компоненты NIO:

  1. Буферы (Buffers): Контейнеры для данных (ByteBuffer, CharBuffer).
  2. Каналы (Channels): Шлюзы для ввода/вывода (FileChannel, SocketChannel).
  3. Селекторы (Selectors): Позволяют одному потоку мониторить множество каналов на готовность к I/O-операциям.

NIO идеально подходит для высоконагруженных серверных приложений с большим количеством одновременных соединений.