différence entre bytebuffer.flip() et bytebuffer.rewind()
Je suis conscient que flip() set le tampon courant de la position 0 et la limite supérieure à la précédente tampon position alors que rewind() il suffit de régler le tampon courant de la position à 0.
Dans le code suivant, soit je utiliser rewind() ou flip() j'obtiens le même résultat.
byte b = 127;
bb.put(b);
bb.rewind();//or flip();
System.out.println(bb.get());
bb.rewind();//or flip();
System.out.println(bb.get());
Pourriez-vous me fournir un exemple réel, d'où la différence de ces 2 méthodes qui compte vraiment? Merci à l'avance.
EDIT: j'ai trouvé la solution dans cette lien, c'est très bien expliqué et détaillé pour une compréhension approfondie de la mémoire tampon et le canal de classes.
OriginalL'auteur Rollerball | 2013-05-09
Vous devez vous connecter pour publier un commentaire.
Ils ne sont pas équivalentes.
Un
ByteBuffer
est normalement prêt pourread()
(ou pourput()
).flip()
le rend prêt pourwrite()
(ou pourget()
).rewind()
etcompact()
etclear()
, il est prêt àread()/put()
de nouveau aprèswrite()
(ouget()
).read()/put()
etwrite()/get()
? Ne doit-il pas êtreread()/get()
etwrite()/put()
? Depuis l'obtention de fonctionnement des moyens de lecture et de mettre implique l'écriture?met les données dans la mémoire tampon.
write()
qu'il faut.Ce n'est pas une grande réponse, car elle explique la sémantique de ByteBuffer des opérations dans le cadre de l'utiliser avec des Canaux ou des prises de courant (ou de tout ce qui a
read()
etput()
méthodes qui vous parle, nous ne savons pas)Non, il n'est pas.
ReadableChannel
aread()
,WriteableChannel
awrite()
, etByteBuffer
lui-même aget()
etput()
. Il n'y a pas d'autre moyen d'obtenir les données dans et hors. C'est plutôt basique. Vous personnellement peut ne pas savoir, mais ce n'est pas la réponse de la faute.OriginalL'auteur user207421
À partir du code source, ils sont très similaires. Vous pouvez voir la suite:
Si la différence est la
flip
définir lalimit
à laposition
, tandis querewind
pas.Considérez que vous avez alloué un tampon avec 8 octets, vous avez rempli le buffer avec 4 octets, alors la position est définie sur 3, suffit de se présenter comme suit:
Donc
rewind
juste utilisé de la limite de définir de façon appropriée.OriginalL'auteur lxy
Le rewind( ) la méthode est similaire à flip ( ), mais n'affecte pas la limite. Il ne définit la position à 0. Vous pouvez utiliser rewind( ) pour revenir en arrière et de relire les données dans une mémoire tampon qui a déjà été retournée. Une situation commune serait : après l'utilisation de flip(), et de lire les données de la mémoire tampon, vous souhaitez consulter les données, cette méthode pourrait fonctionner.
OriginalL'auteur sofia
Voici un exemple où les deux vont produire des résultats différents.
Comme vous l'avez dit, à la fois de définir la position à 0, la différence entre les deux est que la flip a pas de limite à la position précédente.
Donc avec flip, si vous avez écrit ( mis ) , la limite pour la lecture ( get ) va devenir la position du dernier élément que vous avez écrit. Si vous essayez de lire plus avant, il va lever une exception.
Rewind laisse la limite inchangée. En supposant qu'il était à la capacité ( taille de la mémoire tampon ) , il vous permettra de garder sur la lecture au-delà des données que vous avez réellement écrit, dans ce cas, la lecture de la zéros initiaux que le tampon a été initialisé avec.
OriginalL'auteur Gonen I
@user963241 Pour ajouter plus de couleur sur @EJP réponse.
get() Exemple;
Vous voudrez peut-être lire les données à partir de la mémoire tampon (en supposant que vous aviez initialement stockées dans)et l'utiliser pour autre chose, comme la conversion d'une chaîne de caractères et de les manipuler pour une utilisation ultérieure.
write() Exemple; Après avoir lu les données de prise de canal dans le tampon vous pourriez écrire de nouveau à douille canal - en supposant que vous souhaitez mettre en place quelque chose comme un serveur echos même message reçu de client.
De sorte que vous aurez lu à partir du canal de tampon et de tampon de canal
OriginalL'auteur crakama
Tampon a la position, la limite et la capacité de propriétés. Vous pouvez allouer de l'espace pour le nombre n d'éléments lors de la création d'un tampon. Ici, n est la capacité. Après le tampon est alloué, la position est définie à 0 et la limite est de la capacité.
Si vous avez rempli le buffer avec la n-x nombre d'éléments, la position sera définie sur n-x. Tampon devra éléments vides après le n-x.
Si vous désirez faire une vidange de la mémoire tampon à ce point et que, trop envie non seulement des valeurs vides, vous devez définir la limite à la position actuelle et la position zéro. À l'aide de hasRemaining(), vous pouvez obtenir les éléments jusqu'au n-x. Flip a pas de limite et la position comme décrit ci-dessus.
Différence entre rabat et rewind est que flip définit la position à 0 et définit la limite pour le contenu actif. Méthode de rembobinage juste définit la position à 0.
Pour plus d'informations http://www.zoftino.com/java-nio-tutorial
OriginalL'auteur Arnav Rao