106 votes

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

Pourquoi la méthode flip() de ByteBuffer est-elle appelée "flip" ? Qu'est-ce qui est "flippé" ici ? D'après apidoc, deux flips successifs ne restaureront pas l'état d'origine, et des flips multiples tendront probablement à limit() pour devenir nul.

Puis-je "déplier" en quelque sorte pour réutiliser les octets sortis d'une limite ?

Puis-je concaténer la queue pour qu'elle soit inversée avec d'autres données ?

141voto

nneonneo Points 56821

Un cas d'utilisation assez courant de la ByteBuffer consiste à construire une structure de données pièce par pièce, puis à écrire l'ensemble de cette structure sur le disque. flip est utilisé pour inverser le ByteBuffer de "lecture de l'E/S" ( put ting) à "écriture sur E/S" ( get ting) : après une séquence de put est utilisé pour remplir le ByteBuffer , flip fixera la limite du tampon à la position actuelle et remettra la position à zéro. Cela a pour effet de rendre un futur get o write de la mémoire tampon écrire tout ce qui était put dans le tampon et pas plus.

Après avoir terminé le put vous pourriez vouloir réutiliser le ByteBuffer pour construire une autre structure de données. Pour la "déplier", appelez clear . Cela réinitialise la limite à la capacité (rendant toute la mémoire 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);
}

11voto

Arnav Rao Points 2156

Flip attribue la valeur de la position actuelle à la propriété limit et définit la propriété position à 0 . Flip est utile pour ne drainer que les éléments actifs d'un tampon.

Par exemple, le programme ci-dessous imprime "hello" au lieu des éléments vides du tampon. La méthode appelle limit y position peut être remplacé par flip .

CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello"); 
// These two lines below are 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.

2voto

vkohli Points 45

flip() rend un tampon prêt pour une nouvelle séquence d'opérations d'écriture de canal ou de récupération relative : Elle fixe la limite à la position actuelle, puis met la position à zéro.

La mémoire tampon garde la trace des données qui y sont écrites. Écriture postale, flip() est appelée pour passer du mode écriture au mode lecture.

1voto

irreputable Points 25577

Un tampon a une valeur fixe capacity il maintient 2 pointeurs : start y end . get() renvoie l'octet à l'adresse start position et incréments start . put() met l'octet au end position et incréments end . Non flip() !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X