Получает байтовый массив из ByteBuffer в Java

Это рекомендуемый способ получить байты от ByteBuffer

ByteBuffer bb =..

byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);

6 ответов

Зависит от того, что вы хотите сделать.

Если вы хотите получить оставшиеся байты (между позицией и лимитом), то то, что у вас есть, будет работать. Вы также можете просто сделать:

ByteBuffer bb =..

byte[] b = new byte[bb.remaining()]
bb.get(b);

что эквивалентно согласно Javadocs ByteBuffer.

Обратите внимание, что bb.array() не учитывает позицию байтовых буферов и может быть еще хуже, если байтбуфер, над которым вы работаете, является частью какого-то другого буфера.

Т.е.

byte[] test = "Hello World".getBytes("Latin1");
ByteBuffer b1 = ByteBuffer.wrap(test);
byte[] hello = new byte[6];
b1.get(hello); // "Hello "
ByteBuffer b2 = b1.slice(); // position = 0, string = "World"
byte[] tooLong = b2.array(); // Will NOT be "World", but will be "Hello World".
byte[] world = new byte[5];
b2.get(world); // world = "World"

Что не может быть тем, что вы намереваетесь сделать.

Если вы на самом деле не хотите копировать байтовый массив, обходным путем может быть использование arrayOffset() + оставаясь () байтового буфера, но это работает только в том случае, если приложение поддерживает index+length байтовых буферов. необходимо.

Так просто

  private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
    byte[] bytesArray = new byte[byteBuffer.remaining()];
    byteBuffer.get(bytesArray, 0, bytesArray.length);
    return bytesArray;
}
final ByteBuffer buffer;
if (buffer.hasArray()) {
    final byte[] array = buffer.array();
    final int arrayOffset = buffer.arrayOffset();
    return Arrays.copyOfRange(array, arrayOffset + buffer.position(),
                              arrayOffset + buffer.limit());
}
// do something else

Если кто-то ничего не знает о внутреннем состоянии данного (Direct)ByteBuffer и хочет извлечь все содержимое буфера, это можно использовать:

ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);

Это простой способ получить byte[], но часть смысла использования ByteBuffer избегает необходимости создавать byte[]. Возможно, вы можете получить все, что вы хотели получить от байта [] непосредственно от ByteBuffer.

Другие вопросы по тегам