Что означают позиция, лимит и ёмкость у ByteBuffer, и что делает flip()?
Ёмкость — размер буфера, позиция — курсор следующего чтения или записи, лимит — граница доступных данных. flip() ставит лимит на текущую позицию и обнуляет позицию — переключает буфер из записи в чтение.
- clear() — подготовить к записи заново (данные не стираются)
- compact() — сдвинуть непрочитанное в начало и продолжить запись
- Забытый flip — читаете мусор или ничего
А ещё rewind() — перечитать с начала, не меняя лимит
Подробно
Буфер один и тот же для чтения и записи, поэтому режимы переключают вручную — на этом спотыкаются чаще всего. После записи данных позиция стоит за последним записанным байтом; flip запоминает её как лимит и возвращает позицию в ноль, чтобы прочитать ровно то, что записано. Дальше clear готовит буфер к новой записи (позиция в ноль, лимит в ёмкость), не стирая содержимое, а compact сдвигает непрочитанный остаток в начало — это нужно, когда данные вычитаны не полностью. Смена порядка байтов делается отдельно методом order, а не flip.
Что хотят услышать
- Три величины.
- flip, clear, compact.
Частые ошибки
- Забыть flip перед чтением и получить ноль байтов.
- Считать, что clear стирает данные — он лишь сбрасывает указатели.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Лимит = позиция, позиция = 0: буфер готов к чтению
- ✗flip() меняет порядок байтов на противоположный (big-endian на little-endian)
- ✗flip() очищает буфер и обнуляет все три показателя
- ✗flip() переставляет элементы буфера в обратном порядке
Что спросят дальше
- Чем compact отличается от clear?
- Что такое direct buffer и когда он оправдан?
Разбор темы
- NIO: каналы, буферы и неблокирующий ввод-вывод
io против nio, Channel и ByteBuffer с его flip/clear, Selector и event loop, влияние виртуальных потоков и NIO.2.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.