Gymterview
junior

Какие особенности NIO вы знаете?

NIO (New I/O) — это пакет java.nio, появившийся в Java 1.4 и предоставляющий альтернативный, более производительный API для операций ввода/вывода. Он построен вокруг трёх ключевых концепций: каналов, буферов и селекторов.

Каналы и селекторы

NIO поддерживает различные типы каналов — абстракций более низкого уровня для работы с файловой системой и сетью. Каналы позволяют передавать данные с более высокой скоростью за счёт прямого взаимодействия с механизмами ОС. Каналы могут работать в неблокирующем режиме, а селекторы позволяют одному потоку выполнения одновременно мониторить несколько каналов, выбирая те, которые готовы к операциям чтения или записи.

Буферы

NIO предоставляет буферизацию через абстрактный класс Buffer и его подклассы для всех примитивных типов (кроме boolean): ByteBuffer, CharBuffer, IntBuffer, LongBuffer, FloatBuffer, DoubleBuffer, ShortBuffer. Буфер — это контейнер фиксированного размера с операциями clear(), flip(), rewind(), mark() и reset() для управления позицией чтения/записи.

Кодировки

В пакете java.nio.charset находятся кодеры (CharsetEncoder) и декодеры (CharsetDecoder), обеспечивающие преобразование между байтовыми последовательностями и символами Unicode. Это позволяет точно контролировать процесс кодирования, включая обработку ошибок (замена, игнорирование, выброс исключения).

Дополнительные возможности

  • Поддержка файловых блокировок (FileLock) для координации доступа к файлу между процессами.
  • Memory-mapped файлы (MappedByteBuffer) для отображения файлов в оперативную память.
  • Scatter/Gather операции — чтение из канала в несколько буферов и запись из нескольких буферов в канал за одну операцию.

На собеседовании: перечислите три кита NIO — каналы, буферы, селекторы — и поясните, что NIO даёт производительность за счёт неблокирующего ввода/вывода и буферизации, но при этом усложняет код по сравнению с классическим IO.