Что такое каналы?
Каналы (channels) — это логические порталы для ввода/вывода данных в NIO, выступающие абстракцией над низкоуровневыми механизмами файловой системы и сети операционной системы.
Аналогия из жизни: канал — это водопроводная труба, по которой данные текут между приложением и внешним источником (файл, сеть). Буфер — это ведро, которое наполняется на одном конце трубы и опустошается на другом.
При вводе данные из канала помещаются в предоставленный буфер. При выводе данные из буфера передаются в канал. Каналы напоминают трубопроводы, обеспечивающие эффективный транспорт данных с минимальными накладными расходами, поскольку они работают на уровне системных вызовов ОС.
Основные реализации каналов
| Канал | Назначение |
|---|---|
FileChannel |
Чтение/запись файлов, поддержка memory-mapped файлов |
SocketChannel |
Чтение/запись через TCP-сокет |
ServerSocketChannel |
Прослушивание входящих TCP-соединений |
DatagramChannel |
Чтение/запись через UDP |
Pipe.SinkChannel / Pipe.SourceChannel |
Однонаправленная передача данных между потоками |
Ключевые свойства
- Каналы могут быть двунаправленными (в отличие от потоков IO, где отдельно InputStream и OutputStream).
- Каналы могут работать в неблокирующем режиме (кроме
FileChannel). - Канал всегда читает в буфер и пишет из буфера — прямое чтение байт без буфера невозможно.
- Каналы реализуют интерфейс
AutoCloseableи должны закрываться после использования.
На собеседовании: объясните, что канал — это абстракция соединения с источником/приёмником данных, работающая через буферы. Подчеркните отличие от потоков IO: двунаправленность и возможность неблокирующего режима.