Was ist der Zweck der Flip-Methode von ByteBuffer? (Und warum heißt es "Flip"?)


90

Warum heißt die flip () -Methode von ByteBuffer "flip"? Was ist hier "umgedreht"? Laut Apidoc werden zwei aufeinanderfolgende Flips den ursprünglichen Zustand nicht wiederherstellen, und mehrere Flips werden wahrscheinlich dazu neigen limit(), Null zu werden.

Kann ich irgendwie "umdrehen", um die Wiederverwendung von Bytes zu überschreiten?

Kann ich den Schwanz verketten, um ihn mit anderen Daten umzudrehen?


4
Es "kippt" den Puffer von Lesen zu Schreiben (und umgekehrt). thushw.blogspot.com/2009/10/…
Brian Roach

2
@BrianRoach: Es wechselt von Lesen zu Schreiben, ist jedoch nicht so nützlich für Schreiben zu Lesen, es sei denn, Sie schreiben Strukturen mit fester Größe. Verwenden Sie resetstattdessen zum Umblättern zum Schreiben zum Lesen .
Nneonneo

Denken Sie daran, "objektive" Fragen zu stellen. oder zumindest die vorherrschende Frage objektiv erscheinen lassen: D

@nneonneo - Es war ein bisschen keine Frage, würde nicht wirklich viel Zeit damit verbringen, die Details zu erklären, daher nur ein Kommentar und ein Link.
Brian Roach

Antworten:


125

Ein ziemlich häufiger Anwendungsfall für das ByteBufferbesteht darin, eine Datenstruktur Stück für Stück zu erstellen und dann die gesamte Struktur auf die Festplatte zu schreiben. flipwird verwendet, um ByteBuffervon "Lesen von E / A" ( putting) zu "Schreiben in E / A" ( getting) zu wechseln: Nachdem eine Folge von puts zum Füllen des verwendet wird ByteBuffer, flipwird die Grenze des Puffers auf die aktuelle Position gesetzt und setzen Sie die Position auf Null zurück. Dies hat den Effekt, dass eine Zukunft erstellt wird getoder writeaus dem Puffer alles putin den Puffer geschrieben wird und nicht mehr.

Nach Abschluss des putkönnen Sie das wiederverwenden ByteBuffer, um eine andere Datenstruktur zu erstellen. Rufen Sie auf, um die Funktion zu "entklappen" clear. Dadurch wird die Begrenzung der Kapazität (wodurch der gesamte Puffer verwendet werden kann) und die Position auf 0 zurückgesetzt.

Ein typisches Nutzungsszenario:

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);
}

Was ist eine Art von out?
Suzan Cioc

6
Oder irgendetwas anderes, das eine write(ByteBuffer)Methode hat. (Es ist nicht wirklich relevant, was sein Typ ist ...)
Stephen C

1
Es sollte Buffer.cleardie Reset-Grenze auf Kapazität und Position auf 0 Buffer.resetzurücksetzen. Nur Position auf zurücksetzen mark.
Kelvin Ng

1
@ KelvinNg: Du hast recht; Ich habe die Antwort geändert, um dies widerzuspiegeln. Danke für den schönen Fang!
Nneonneo

1
@ user963241: Von E / A in Puffer lesen , aus Puffer in E / A schreiben .
Nneonneo

6

Flip weist der Limit-Eigenschaft den aktuellen Positionswert zu und setzt die Positionseigenschaft auf 0. Flip ist nützlich, um nur aktive Elemente aus einem Puffer zu entleeren.

Das folgende Programm druckt beispielsweise "Hallo", nicht leere Pufferelemente. Limit und Position für Methodenaufrufe können durch Flip ersetzt werden.

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());
}

Weitere Informationen zu Puffern und Kanälen finden Sie unter http://www.zoftino.com/java-nio-tutorial .


1

ByteBuffer ist schlecht gestaltet. Es gibt viele Beschwerden von anständigen Programmierern.

Versuchen Sie also nicht, darüber nachzudenken, sondern studieren und verwenden Sie die API sorgfältig.

Jetzt kann ich es nicht schlecht machen, ohne eine Alternative vorzustellen, also hier ist es:

Ein Puffer hat einen festen capacity; Es werden 2 Zeiger beibehalten: startund end. get()Gibt das Byte an der startPosition zurück und erhöht es start. put()Setzt das Byte an die endPosition und erhöht es end. Nein flip()!


5
Also, was sind die Beschwerden? Wenn Sie eine persönliche Beschwerde haben, ist das auch in Ordnung, aber es reicht nicht aus, nur zu sagen "X API ist scheiße, die Leute haben es gesagt".
Nneonneo

12
Das Posten dieses Links ist buchstäblich alles, was Sie zuerst tun mussten. Ich habe Sie nie des Lügens beschuldigt, sondern Sie lediglich gebeten, die Quelle und die Art der Beschwerden zu erläutern.
Nneonneo

2
Dies ist nur ein Ort, an dem Menschen freiwillig ihre Hilfe anbieten, mit dem richtigen Aufwand, den sie wählen. Ich muss nicht jede Antwort zu einer gut recherchierten wissenschaftlichen Arbeit erweitern.
unwiderlegbar

8
und dies ist auch ein Ort, an dem Menschen nicht jemandes Wort nehmen, es sei denn, es klingt glaubwürdig.
Arunmoezhi

8
Sie müssen nicht einmal Quellen angeben. Es ist offensichtlich, dass ByteBuffer schlecht gestaltet ist. Flip erfüllt keinen Zweck, sondern führt nur eine Fehlerquelle ein, wenn Sie das Flip vergessen. Wenn sie einen unkontrollierbaren Drang verspürten, es einzufügen, machen Sie zumindest gespiegelte und nicht gespiegelte ByteBuffer zu verschiedenen Klassen, damit das Typsystem die Fehler abfangen kann.
Gurgeh

0

Die Methode flip () bereitet einen Puffer für eine neue Sequenz von Kanalschreib- oder relativen Abrufoperationen vor: Sie setzt die Grenze auf die aktuelle Position und setzt dann die Position auf Null.

Der Puffer verfolgt die darin geschriebenen Daten. Nach dem Schreiben wird die flip () -Methode aufgerufen, um vom Schreib- in den Lesemodus zu wechseln.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.