Obtient un tableau d’octets à partir d’un ByteBuffer dans Java

Est-ce la manière recommandée d’obtenir les octets du ByteBuffer?

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

Ça dépend de ce que tu veux faire.

Si vous voulez récupérer les octets restants (entre position et limite), alors ce que vous avez fonctionnera. Vous pourriez aussi simplement faire:

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

ce qui est équivalent selon les javadocs de ByteBuffer.

Notez que le fichier bb.array () n’honore pas la position des tampons d’octets et peut même être pire si le tampon d’octets sur lequel vous travaillez est une tranche d’un autre tampon.

C’est à dire

 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, ssortingng = "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 tableau d’octets, une solution pourrait être d’utiliser le arrayOffset () + demeure () du tampon d’octets, mais cela ne fonctionne que si l’application prend en charge l’index + longueur des tampons d’octets. Besoins.

 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 

Si on ne sait rien de l’état interne du ByteBuffer (Direct) donné et que l’on veut récupérer tout le contenu du tampon, cela peut être utilisé:

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

Aussi simple que cela

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

C’est un moyen simple d’obtenir un octet [], mais une partie du point d’utilisation d’un ByteBuffer consiste à éviter de créer un octet []. Vous pouvez peut-être obtenir tout ce que vous voulez obtenir de l’octet [] directement à partir de ByteBuffer.