Каковы примеры приложений для 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 очень полезны, особенно если файлы большие и к нескольким группам блоков обращаются чаще.