Получает байтовый массив из ByteBuffer в Java - PullRequest
79 голосов
/ 25 марта 2009

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

ByteBuffer bb =..

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

Ответы [ 6 ]

94 голосов
/ 25 марта 2009

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

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

ByteBuffer bb =..

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

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

18 голосов
/ 19 ноября 2012

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

* 1003 Т.е. *

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

5 голосов
/ 10 октября 2017

Так просто

  private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
    byte[] bytesArray = new byte[byteBuffer.remaining()];
    byteBuffer.get(bytesArray, 0, bytesArray.length);
    return bytesArray;
}
4 голосов
/ 04 февраля 2017

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

ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
4 голосов
/ 21 апреля 2014
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
1 голос
/ 25 марта 2009

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

...