Quel est le but de ByteBuffer flip méthode? (Et pourquoi est-il appelé “flip”?)
Pourquoi ne ByteBuffer flip() méthode appelée "flip"? Ce qui est "renversé" ici? Selon apidoc, deux successives flips ne pas restaurer l'état d'origine, et de multiples pirouettes aura probablement tendance limit()
pour devenir zéro.
Puis-je "unflip" en quelque sorte à la réutilisation octets sortit d'une limite?
Je peux concaténer queue à être retourné avec d'autres données?
- Il "bascule" de la mémoire tampon de lecture pour écrire (et vice versa). thushw.blogspot.com/2009/10/...
- Elle se retourne de lire pour écrire, mais n'est pas aussi utile pour l'écriture à la lecture, à moins que vous écrivez fixe la taille des structures. Pour retourner à écrire pour lire, utiliser
reset
à la place. - N'oubliez pas de demander "objectif" questions; ou, au moins, faire la principale question semblent objectif 😀
- C'était un peu la non-question, n'était pas vraiment l'intention de passer beaucoup de temps à expliquer les détails, donc juste un commentaire et un lien.
Vous devez vous connecter pour publier un commentaire.
Un assez commun de cas d'utilisation pour la
ByteBuffer
est de construire une structure de données de morceau par morceau, puis d'écrire que l'ensemble de la structure sur le disque.flip
est utilisé pour inverser laByteBuffer
de "lecture à partir d'I/O" (put
ting) à "l'écriture de l'I/O" (get
ting): après une séquence deput
s est utilisé pour remplir l'ByteBuffer
,flip
permettra de définir la limite de la mémoire tampon à la position actuelle et de réinitialiser la position zéro. Cela a pour effet de rendre la futureget
ouwrite
à partir de la mémoire tampon d'écriture tout ce qui a étéput
dans la mémoire tampon et rien de plus.Après la fin de la
put
, vous pouvez réutiliser leByteBuffer
construire une autre structure de données. Pour "unflip", appelezclear
. Cela réinitialise la limite de la capacité de la mémoire tampon utilisable), et la position à 0.Donc, un scénario d'utilisation habituelle:
out
?WritableByteChannel
, commeFileChannel
ouSocketChannel
.write(ByteBuffer)
méthode. (Il n'est pas vraiment pertinent quel est son type ...)Buffer.clear
qui rétablissent la limite de la capacité et de la position à 0.Buffer.reset
réinitialiser seule position àmark
.compact()
qui se déplace au début de la mémoire tampon, de sorte que vous pouvez continuer à lire les octets dans le tampon après eux.put
de l'écriture de données dans la mémoire tampon.Flip assigne la valeur de position actuelle à la limite de la propriété et définit la position de la propriété à 0. Flip est utile pour drainer des éléments actifs d'un buffer.
Par exemple, ci-dessous le programme écrit "bonjour" n'est pas vide éléments de la mémoire tampon. Les appels de méthode limite et la position peut être remplacé par flip.
Voir http://www.zoftino.com/java-nio-tutorial pour plus d'informations sur les tampons et les canaux.
ByteBuffer est mal conçu. Il y a beaucoup de plaintes de décent programmeurs.
Alors n'essayez pas de raison à ce sujet, l'étude et l'utilisation de l'API soigneusement.
Maintenant je ne peux pas dénigrer sans la présentation d'une alternative, si elle est ici:
Une mémoire tampon a un fixe
capacity
; il maintient 2 pointeurs:start
etend
.get()
renvoie l'octet à l'start
position et incrémentestart
.put()
met l'octet à l'end
position et incrémenteend
. Pas deflip()
!ByteBuffer
). Aussi, les docs disent il n'y a qu'une "position actuelle", pas un "début" et "fin".flip
sonne comme le tampon de direction est inversée. Ils ont besoin d'un verbe à représenter le changement de mode;switch
est un mot-clé, de sorte qu'il est invalide, etshift
a une tout autre signification dans un peu de contexte.swap
ouchange
sont de meilleurs choix queflip
.flip() méthode permet un tampon prêt pour une nouvelle séquence de canal-écrire ou un parent de lancer des opérations: Il définit la limite de la position actuelle, puis détermine la position à zéro.
Tampon permet de suivre les données écrites sur elle. Post écrit, flip() méthode est appelée pour passer de l'écriture à la lecture.