Est-ce la méthode recommandée pour obtenir les octets de la ByteBuffergets tableau d'octets d'un ByteBuffer en Java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Est-ce la méthode recommandée pour obtenir les octets de la ByteBuffergets tableau d'octets d'un ByteBuffer en Java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
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.
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.
Mais souvent vous devrez appeler quelque chose (pas dans votre propre code) qui prend un byte [], donc la conversion n'est pas optionnelle. –
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.
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 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);
Aussi simple que
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
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
@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
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. –