Это рекомендуемый способ получить байты из ByteBuffer
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Это рекомендуемый способ получить байты из ByteBuffer
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Зависит от того, что вы хотите сделать.
Если вы хотите получить оставшиеся байты (между позицией и лимитом), то то, что у вас есть, будет работать. Вы также можете просто сделать:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b);
который эквивалентен ByteBuffer javadocs.
Обратите внимание, что 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() + остаток(), но это работает только в том случае, если приложение поддерживает индекс + длину байта которые необходимы.
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
Если вы ничего не знаете о внутреннем состоянии данного (прямого) ByteBuffer и хотите получить все содержимое буфера, это можно использовать:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
Это простой способ получить байт [], но часть точки использования ByteBuffer позволяет избежать создания байта []. Возможно, вы можете получить все, что хотите получить из байт [], непосредственно из ByteBuffer.
Так же просто, как
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}