2009-03-24 28 views

Antwort

82

Hängt zu bekommen, was Sie tun mögen.

Wenn Sie die verbleibenden Bytes abrufen möchten (zwischen Position und Limit), dann wird das funktionieren, was Sie haben. Sie könnten auch einfach tun:

ByteBuffer bb =.. 

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

, die gemäß den ByteBuffer javadocs entspricht.

+5

Korrekt. Und beachte, dass 'bb.capacity()' * * bb.remaining() 'auch dann gleich sein kann, wenn das backing-Array länger ist, also musst du ihre Gleichheit nicht als Test verwenden, wenn' bb.array() 'korrekt ist . Siehe 'ByteBuffer.slice()'. – cdunn2001

+0

@JasonS Ich habe eine Frage hier auf [bytebuffer] (http://stackoverflow.com/questions/40798677/combine-multiple-fields-into-a-single-byte-array-using-bytebuffer). Wollte sehen, ob du helfen kannst. – user1950349

+0

Beachten Sie, dass ich 'bb.slice(). Resting()' verwendete, um die Position des Puffers zu ändern. Auf diese Weise sieht es wie ein sauberer Speicher aus, ohne den ursprünglichen Puffer zu berühren. –

2

Dies ist ein einfacher Weg, um ein Byte [] zu erhalten, aber ein Teil des Punktes der Verwendung eines ByteBuffers ist die Vermeidung eines Bytes []. Vielleicht können Sie aus dem Byte [] direkt aus dem ByteBuffer holen, was Sie wollen.

+10

Aber oft müssen Sie etwas (nicht in Ihrem eigenen Code) aufrufen, das ein Byte [] benötigt, daher ist die Konvertierung nicht optional. –

16

Beachten Sie, dass die bb.array() die Byte-Puffer-Position nicht berücksichtigt, und möglicherweise noch schlechter, wenn der Bytepuffer, den Sie bearbeiten, ein Stück eines anderen Puffers ist.

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" 

Was möglicherweise nicht das ist, was Sie beabsichtigen zu tun.

Wenn Sie wirklich nicht wollen, das Byte-Array zu kopieren, könnte eine Umgehung aroundOffset() + resting() des Byte-Puffers sein, aber das funktioniert nur, wenn die Anwendung index + length des Byte-Puffer benötigt es.

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

Wenn man nichts über den internen Zustand der gegebenen (Direct) weiß ByteBuffer und will den ganzen Inhalt des Puffers abzurufen, kann diese verwendet werden:

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

So einfach wie dass

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