Pourquoi la méthode flip () de ByteBuffer appelée "flip"? Qu'est-ce qui est "retourné" ici? Selon apidoc, deux retournements successifs ne restaureront pas l’état initial et plusieurs renversements auront probablement tendance à devenir limit()
nuls.
Puis-je "décompresser" d'une manière ou d'une autre pour réutiliser des octets sortis d'une limite?
Puis-je concaténer la queue à retourner avec d'autres données?
Un cas d'utilisation assez courant pour la variable ByteBuffer
consiste à construire une structure de données pièce par pièce, puis à écrire cette structure entière sur le disque. flip
est utilisé pour basculer la ByteBuffer
de "lecture à partir d'E/S" (put
ting) en "écriture à I/O" (get
ting): après qu'une séquence de put
s soit utilisée pour remplir ByteBuffer
, flip
définira la limite du tampon à la position actuelle et réinitialiser la position à zéro. Cela a pour effet de faire en sorte que la future variable get
ou write
du tampon écrive tout ce qui était put
dans le tampon et pas davantage.
Une fois que vous avez terminé put
, vous souhaiterez peut-être réutiliser ByteBuffer
pour construire une autre structure de données. Pour le "décompresser", appelez clear
. Ceci réinitialise la limite à la capacité (rendant tout le tampon utilisable) et la position à 0.
Donc, un scénario d'utilisation typique:
ByteBuffer b = new ByteBuffer(1024);
for(int i=0; i<N; i++) {
b.clear();
b.put(header[i]);
b.put(data[i]);
b.flip();
out.write(b);
}
Flip affecte la valeur de position actuelle à la propriété limit et définit la propriété position à 0. Flip est utile pour drainer uniquement les éléments actifs d'un tampon.
Par exemple, le programme ci-dessous affiche "hello" et non des éléments vides du tampon. Les appels de méthode limit et position peuvent être remplacés par un retournement.
CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello");
// what below two line of code is what flip does
cbuff.limit(cbuff.position());
cbuff.position(0);
while(cbuff.hasRemaining()) {
System.out.println(cbuff.get());
}
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 programmeurs décents.
Alors n'essayez pas de raisonner, étudiez et utilisez l'API avec précaution.
Maintenant, je ne peux pas la critiquer sans présenter une alternative, alors la voici:
Un tampon a une capacity
fixe; il contient 2 pointeurs: start
et end
. get()
renvoie l'octet à la position start
et incrémente start
. put()
met l'octet à la position end
et incrémente end
. Non flip()
!
flip () method prépare un tampon pour une nouvelle séquence d'opérations d'écriture sur un canal ou relative: il définit la limite à la position actuelle, puis la position à zéro.
Le tampon garde une trace des données écrites dans celui-ci. Après écriture, la méthode flip () est appelée pour passer du mode écriture au mode lecture.