web-dev-qa-db-fra.com

Obtient un tableau d'octets à partir d'un ByteBuffer dans java

Est-ce la méthode recommandée pour obtenir les octets à partir du ByteBuffer?

ByteBuffer bb =..

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

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

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

ByteBuffer bb =..

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

qui est équivalent selon le ByteBuffer javadocs.

97
Jason S

Notez que bb.array () n'honore pas la position des tampons d'octets et peut même être pire si le tampon d'octet 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, 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 tableau d'octets, vous pouvez utiliser la méthode arrayOffset () + restante () du tampon d'octets, mais cela ne fonctionne que si l'application prend en charge l'index + la longueur des tampons octets. Besoins.

18
R4zorax

Aussi simple que cela

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

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

ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
4
Tomáš Myšík
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
4
Jin Kwon

C’est un moyen simple d’obtenir un octet [], mais le fait d’utiliser un ByteBuffer a notamment pour but d’éviter de créer un octet []. Peut-être que vous pouvez obtenir ce que vous voulez obtenir de l'octet [] directement à partir de ByteBuffer.

1
Peter Lawrey