Ответ
Нет, 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:
- Буферы (Buffers): Контейнеры для данных (
ByteBuffer,CharBuffer). - Каналы (Channels): Шлюзы для ввода/вывода (
FileChannel,SocketChannel). - Селекторы (Selectors): Позволяют одному потоку мониторить множество каналов на готовность к I/O-операциям.
NIO идеально подходит для высоконагруженных серверных приложений с большим количеством одновременных соединений.