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

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

ByteBuffer bb =..

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

Ответ 1

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

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

ByteBuffer bb =..

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

который эквивалентен ByteBuffer javadocs.

Ответ 2

Обратите внимание, что 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() + остаток(), но это работает только в том случае, если приложение поддерживает индекс + длину байта которые необходимы.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Так же просто, как

  private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
    byte[] bytesArray = new byte[byteBuffer.remaining()];
    byteBuffer.get(bytesArray, 0, bytesArray.length);
    return bytesArray;
}