2009-03-24 20 views

Répondre

82

dépend de ce que vous voulez faire.

Si ce que vous voulez est de récupérer les octets qui restent (entre la position et la limite), alors ce que vous avez fonctionnera. Vous pouvez aussi faire simplement:

ByteBuffer bb =.. 

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

ce qui équivaut selon les ByteBuffer javadocs.

+5

Correct. Et notez que 'bb.capacity()' * pourrait être égal à 'bb.remaining()' même lorsque le tableau de sauvegarde est plus long, donc vous ne devez pas utiliser leur égalité comme test de quand 'bb.array()' est correct . Voir 'ByteBuffer.slice()'. – cdunn2001

+0

@JasonS J'ai une question ici sur [bytebuffer] (http://stackoverflow.com/questions/40798677/combine-multiple-fields-into-a-single-byte-array-using-bytebuffer). Je voulais voir si vous pouviez aider. – user1950349

+0

Notez que, pour éviter de changer la position du tampon, j'ai utilisé 'bb.slice(). Remaining()'. De cette façon, il ressemble à un vidage propre sans toucher le tampon d'origine. –

2

C'est un moyen simple d'obtenir un octet [], mais une partie de l'utilisation d'un ByteBuffer évite d'avoir à créer un octet []. Peut-être que vous pouvez obtenir ce que vous voulez obtenir de l'octet [] directement à partir du ByteBuffer.

+10

Mais souvent vous devrez appeler quelque chose (pas dans votre propre code) qui prend un byte [], donc la conversion n'est pas optionnelle. –

16

Notez que le bb.array() n'honore pas la position octets-tampons, et pourrait être encore pire si le bytebuffer sur lequel vous travaillez est une tranche d'un autre tampon.

à savoir

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" 

Ce qui pourrait ne pas être ce que vous avez l'intention de faire. Si vous ne voulez vraiment pas copier le byte-array, une solution de rechange pourrait être d'utiliser arrayOffset() + remaining(), mais cela ne fonctionne que si l'application supporte index + length du octets-tampons dont il a besoin.

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

Si l'on ne sait rien sur l'état interne du donné (direct) ByteBuffer et veut récupérer tout le contenu de la mémoire tampon, ce qui peut être utilisé:

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

Aussi simple que

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