Est-ce la méthode recommandée pour 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 la position et la limite), 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 les javadocs ByteBuffer.
bb.capacity()
peut être égalbb.remaining()
même lorsque le tableau de sauvegarde est plus long, vous ne devez donc pas utiliser leur égalité comme un test de quandbb.array()
est correct. VoirByteBuffer.slice()
.bb.slice().remaining()
. De cette façon, cela ressemble à un vidage propre sans toucher le tampon d'origine.int
et utiliser un masque de bits:int unsigned_byte = b[k] & 0xff;
pour une valeur dek
.ByteBuffer#clear
premier?Notez que bb.array () n'honore pas la position des byte-buffers, et pourrait être encore pire si le bytebuffer sur lequel vous travaillez est une tranche d'un autre tampon.
C'est à dire
Ce n'est peut-être pas ce que vous avez l'intention de faire.
Si vous ne voulez vraiment pas copier le tableau d'octets, une solution de contournement pourrait être d'utiliser le arrayOffset () + restant () du tampon d'octets, mais cela ne fonctionne que si l'application prend en charge l'index + la longueur des tampons d'octets. Besoins.
la source
Aussi simple que cela
la source
la source
Si l'on ne sait rien de l'état interne du ByteBuffer (Direct) donné et veut récupérer tout le contenu du buffer, on peut l'utiliser:
la source
ByteBuffer.get(byte[])
renvoie aByteBuffer
data
variable. Le getter revientthis
, voir son Javadoc.C'est un moyen simple d'obtenir un octet [], mais une partie du but d'utiliser un ByteBuffer est d'éviter d'avoir à créer un octet []. Peut-être pouvez-vous obtenir tout ce que vous vouliez obtenir de l'octet [] directement du ByteBuffer.
la source