web-dev-qa-db-fra.com

Quel est le but de la méthode de retournement ByteBuffer? (Et pourquoi s'appelle-t-il "flip"?)

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?

69
Suzan Cioc

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" (putting) en "écriture à I/O" (getting): après qu'une séquence de puts 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);
}
100
nneonneo

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.

3
Arnav Rao

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()!

0
irreputable

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.

0
vkohli