[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-i-o-nio-chto-takoe-bytebuffer-i-kak-s-nim-rabotat":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},685,"chto-takoe-bytebuffer-i-kak-s-nim-rabotat",15,"i-o-nio","I\u002FO & NIO","📁","Что такое ByteBuffer и как с ним работать?","`ByteBuffer` — это буфер для хранения байтовых данных, являющийся ключевым компонентом пакета `java.nio`. Он используется для эффективного чтения и записи данных через каналы NIO.\n\n> Аналогия из жизни: ByteBuffer — это лоток для документов с указателем «текущая позиция». Вы кладёте документы (write), переворачиваете лоток (flip) и начинаете забирать документы (read). Метод clear — очистить лоток для новых документов.\n\n### Свойства буфера\n\nБуфер имеет четыре ключевых свойства, всегда удовлетворяющих инварианту `0 \u003C= mark \u003C= position \u003C= limit \u003C= capacity`:\n\n| Свойство | Описание |\n|---|---|\n| capacity | Максимальная ёмкость, задаётся при создании и не изменяется |\n| position | Индекс следующего элемента для чтения или записи |\n| limit | Граница, за которой чтение\u002Fзапись невозможны |\n| mark | Сохранённая позиция для возврата через `reset()` |\n\n### Создание ByteBuffer\n\n```java\nByteBuffer heapBuffer = ByteBuffer.allocate(1024);         \u002F\u002F в куче JVM\nByteBuffer directBuffer = ByteBuffer.allocateDirect(1024);  \u002F\u002F в нативной памяти\nByteBuffer wrappedBuffer = ByteBuffer.wrap(new byte[1024]); \u002F\u002F обёртка массива\n```\n\nHeap-буфер хранится в куче JVM, быстрее создаётся и управляется GC. Direct-буфер выделяется в нативной памяти ОС, медленнее создаётся, но эффективнее при интенсивном I\u002FO (нет копирования между heap и нативной памятью). Direct-буферы рекомендуется использовать для долгоживущих объектов с частыми операциями ввода\u002Fвывода.\n\n### Основные операции\n\n```java\nByteBuffer buffer = ByteBuffer.allocate(1024);\n\n\u002F\u002F Запись\nbuffer.put((byte) 65);\nbuffer.putInt(42);\nbuffer.put(\"Hello\".getBytes(StandardCharsets.UTF_8));\n\n\u002F\u002F Переключение в режим чтения (обязательно!)\nbuffer.flip();  \u002F\u002F limit = position, position = 0\n\n\u002F\u002F Чтение\nbyte b = buffer.get();\nint num = buffer.getInt();\n\n\u002F\u002F Подготовка к повторной записи\nbuffer.clear();   \u002F\u002F position = 0, limit = capacity (данные не стираются)\nbuffer.compact();  \u002F\u002F непрочитанные данные сдвигаются в начало\n```\n\n### Паттерн чтения из канала\n\n\u003Cdetails>\u003Csummary>Пример чтения\u003C\u002Fsummary>\n\n```java\ntry (FileChannel channel = FileChannel.open(Path.of(\"data.bin\"),\n        StandardOpenOption.READ)) {\n    ByteBuffer buffer = ByteBuffer.allocate(4096);\n    while (channel.read(buffer) != -1) {\n        buffer.flip();\n        while (buffer.hasRemaining()) {\n            byte b = buffer.get();\n        }\n        buffer.clear();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Частые ошибки\n\n- Забывают вызвать `flip()` после записи перед чтением — читают «мусор».\n- Путают `clear()` и `compact()`: `clear()` отбрасывает все данные, `compact()` сохраняет непрочитанные.\n- Создают direct-буферы для мелких короткоживущих операций.\n- Не используют цикл `hasRemaining()` при записи в канал — `channel.write()` может записать не все данные за один вызов.\n\n> **На собеседовании:** объясните цикл жизни буфера (allocate -> put -> flip -> get -> clear), разницу между heap и direct буферами, и почему `flip()` обязателен. Это наиболее частые вопросы по ByteBuffer.","","middle",[15,16,17,18],"core","performance","nio","io",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":38,"featuredSnippetReady":39},"ByteBuffer в Java NIO — Gymterview","ByteBuffer: свойства (capacity, position, limit, mark), heap vs direct буферы, операции put\u002Fget\u002Fflip\u002Fclear\u002Fcompact. Паттерн чтения из канала.","ByteBuffer в Java NIO — как работать — Gymterview","ByteBuffer: создание (heap vs direct), операции put\u002Fget\u002Fflip\u002Fclear\u002Fcompact, паттерн чтения из канала.",[27,28,29,30,31,32,33,34,35,36,37],"ByteBuffer","java.nio","flip","clear","compact","allocateDirect","heap buffer","direct buffer","FileChannel","Java NIO","собеседование","ByteBuffer — буфер для байтовых данных в java.nio, ключевой компонент NIO. Свойства: capacity, position, limit, mark. Создание: allocate (heap), allocateDirect (нативная память), wrap. Цикл: put → flip (переключение в режим чтения) → get → clear\u002Fcompact. Heap-буфер управляется GC, direct-буфер эффективнее для интенсивного I\u002FO. flip() обязателен между записью и чтением.",true]