Каковы примеры приложений для ByteBuffer
в Java? Пожалуйста, перечислите любые примеры сценариев, где это используется. Спасибо!
Каковы примеры приложений для ByteBuffer
в Java? Пожалуйста, перечислите любые примеры сценариев, где это используется. Спасибо!
Ответы:
Это хорошее описание его использования и недостатков. По сути, вы используете его всякий раз, когда вам нужно сделать быстрый ввод-вывод низкого уровня. Если вы собираетесь реализовать протокол TCP / IP или если вы пишете базу данных (СУБД), этот класс пригодится.
Класс ByteBuffer важен, потому что он формирует основу для использования каналов в Java. Класс ByteBuffer определяет шесть категорий операций над байтовыми буферами, как указано в документации по Java 7 :
Абсолютные и относительные методы get и put, которые читают и записывают отдельные байты;
Относительная масса получить методы, которые передают непрерывные последовательности байтов из этого буфера в массив;
Методы относительного массового размещения, которые передают непрерывные последовательности байтов из байтового массива или некоторого другого байтового буфера в этот буфер;
Абсолютные и относительные методы get и put, которые читают и записывают значения других примитивных типов, переводя их в последовательности байтов и из них в определенном порядке байтов;
Методы для создания буферов представления, которые позволяют рассматривать байтовый буфер как буфер, содержащий значения некоторого другого примитивного типа; и
Методы сжатия , дублирования и нарезки байтового буфера.
Example code : Putting Bytes into a buffer.
// Create an empty ByteBuffer with a 10 byte capacity
ByteBuffer bbuf = ByteBuffer.allocate(10);
// Get the buffer's capacity
int capacity = bbuf.capacity(); // 10
// Use the absolute put(int, byte).
// This method does not affect the position.
bbuf.put(0, (byte)0xFF); // position=0
// Set the position
bbuf.position(5);
// Use the relative put(byte)
bbuf.put((byte)0xFF);
// Get the new position
int pos = bbuf.position(); // 6
// Get remaining byte count
int rem = bbuf.remaining(); // 4
// Set the limit
bbuf.limit(7); // remaining=1
// This convenience method sets the position to 0
bbuf.rewind(); // remaining=7
Java IO с использованием потоково-ориентированных API выполняется с использованием буфера в качестве временного хранилища данных в пространстве пользователя. Данные, считанные с диска DMA, сначала копируются в буферы в пространстве ядра, которые затем передаются в буфер в пространстве пользователя. Отсюда и накладные расходы. Отказ от этого может привести к значительному увеличению производительности.
Мы могли бы пропустить этот временный буфер в пользовательском пространстве, если бы был прямой доступ к буферу в пространстве ядра. Java NIO предоставляет способ сделать это.
ByteBuffer
входит в число нескольких буферов, предоставляемых Java NIO. Это просто контейнер или резервуар для хранения данных для чтения или записи данных. Вышеупомянутое поведение достигается путем выделения прямого буфера с использованием allocateDirect()
API на буфере.
Документация по Java для Byte Buffer содержит полезную информацию.
Вот отличная статья, объясняющая преимущества ByteBuffer. Ниже приведены ключевые моменты в статье:
Ниже приведены преимущества специально для прямого ByteBuffer / MappedByteBuffer. Обратите внимание, что прямые буферы создаются вне кучи:
Не зависит от циклов gc : прямые буферы не будут перемещаться во время циклов сборки мусора, поскольку они находятся вне кучи. Технология кэширования TerraCota BigMemory, похоже, в значительной степени опирается на это преимущество. Если бы они были в куче, это замедлило бы время ожидания gc.
Повышение производительности : в потоковом вводе-выводе вызовы чтения повлекут за собой системные вызовы, которые требуют переключения контекста между режимами пользователя и ядра и наоборот, что будет дорогостоящим, особенно если к файлу обращаются постоянно. Однако при отображении в память это переключение контекста уменьшается, поскольку данные с большей вероятностью будут найдены в памяти (MappedByteBuffer). Если данные доступны в памяти, доступ к ним осуществляется напрямую, без вызова ОС, т. Е. Без переключения контекста.
Обратите внимание, что MappedByteBuffers очень полезны, особенно если файлы большие и к нескольким группам блоков обращаются чаще.