2009-03-24 4 views

ответ

82

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

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

ByteBuffer bb =.. 

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

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

+5

Исправить. И обратите внимание, что 'bb.capacity()' * может * равно 'bb.remaining()', даже если массив поддержки больше, поэтому вы не должны использовать их равенство в качестве теста, когда 'bb.array()' правильный , См. 'ByteBuffer.slice()'. – cdunn2001

+0

@JasonS У меня есть вопрос здесь [bytebuffer] (http://stackoverflow.com/questions/40798677/combine-multiple-fields-into-a-single-byte-array-using-bytebuffer). Хотел посмотреть, сможете ли вы помочь. – user1950349

+0

Обратите внимание, что во избежание изменения положения буфера я использовал 'bb.slice(). Остальные()'. Таким образом, он выглядит как чистый дамп, не касаясь исходного буфера. –

2

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

+10

Но часто вам нужно вызывать что-то (не в вашем собственном коде), которое принимает байт [], поэтому преобразование не является необязательным. –

16

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

I.e.

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 
3

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

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

Как просто что

private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) { 
    byte[] bytesArray = new byte[byteBuffer.remaining()]; 
    byteBuffer.get(bytesArray, 0, bytesArray.length); 
    return bytesArray; 
} 
Смежные вопросы