Получить доступ

Что такое буфер (Buffer) в терминах NIO?

JuniorВвод-вывод и NIO
Ещё спрашивают так:
  • Чем NIO отличается от обычного ввода-вывода?
  • Зачем у буфера метод flip()?
  • Что такое Channel и Selector?
Коротко

Buffer — область памяти фиксированного размера, через которую данные читаются из канала и пишутся в него.

  • У буфера есть position, limit и capacity; между записью и чтением — flip()
  • Забытый flip — самая частая ошибка: читается пустота

А ещё NIO даёт каналы, буферы и Selector — один поток обслуживает много соединений

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Классический ввод-вывод (java.io) — потоки, которые передают данные по одному байту или массиву. NIO (java.nio) работает иначе: данные проходят через буфер, которым управляет приложение, а источником или приёмником служит канал (FileChannel, SocketChannel).

У буфера три показателя:

  • capacity — размер;
  • position — где сейчас читаем или пишем;
  • limit — граница доступных данных.

Канал записывает данные в буфер, двигая position. Чтобы прочитать записанное, вызывают flip(): limit становится текущей позицией, а position — нулём. После чтения — clear() или compact(), чтобы снова писать. Забытый flip() — самая частая ошибка: читать оказывается нечего.

Возможности NIO:

  • неблокирующие каналы и Selector — один поток следит за многими сокетами и обрабатывает те, что готовы. На этом построены Netty и другие сетевые серверы;
  • прямые буферы (allocateDirect) — память вне кучи, меньше копирований при работе с ОС;
  • отображение файла в память (MappedByteBuffer).

Для повседневной работы с файлами удобнее java.nio.file.Files.

Пример

try (FileChannel ch = FileChannel.open(Path.of("data.bin"))) {
    ByteBuffer buf = ByteBuffer.allocate(4096);
    while (ch.read(buf) != -1) {
        buf.flip();                 // переключить на чтение
        while (buf.hasRemaining()) process(buf.get());
        buf.clear();                // снова на запись
    }
}

Что хотят услышать

  • Буфер как посредник между приложением и каналом.
  • position, limit, capacity и flip.
  • Что даёт NIO: Selector, неблокирующий ввод-вывод — плюс.

Частые ошибки

  • Забыть переключить буфер между записью и чтением.
  • Считать, что очистка буфера стирает его содержимое.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Область памяти фиксированного размера, через которую данные читаются из канала и записываются в него
  • ✗Очередь задач ввода-вывода, ожидающих выполнения
  • ✗Файл на диске, куда сохраняются промежуточные данные
  • ✗Отдельный поток, обслуживающий операции чтения

Что спросят дальше

  • Что означают позиция, лимит и ёмкость буфера?
  • Чем канал отличается от классического потока?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем