Dlaczego metoda flip () ByteBuffera nazywa się „flip”? Co jest tutaj „odwrócone”? Według apidoc, dwa kolejne przewroty nie przywrócą pierwotnego stanu, a wielokrotne przewroty prawdopodobnie limit()
staną się zerowe.
Czy mogę jakoś „odpiąć”, aby ponownie użyć bajtów, które przekroczyły limit?
Czy mogę połączyć tail, aby zostać odwróconym z innymi danymi?
java
flip
bytebuffer
Suzan Cioc
źródło
źródło
reset
zamiast tego.Odpowiedzi:
Jednym z dość powszechnych przypadków użycia
ByteBuffer
jest konstruowanie struktury danych kawałek po kawałku, a następnie zapisywanie całej struktury na dysku.flip
służy do zamianyByteBuffer
z "odczytu z I / O" (put
ting) na "zapis do I / O" (get
ting): po zastosowaniu sekwencjiput
s do wypełnieniaByteBuffer
,flip
ustawi limit bufora na bieżącą pozycję i zresetuj pozycję do zera. To powoduje, że przyszłośćget
lubwrite
z bufora zapisują wszystko, co byłoput
do bufora i nic więcej.Po zakończeniu
put
możesz chcieć ponownie użyćByteBuffer
do skonstruowania innej struktury danych. Aby to „odpiąć”, zadzwońclear
. Spowoduje to zresetowanie limitu do pojemności (dzięki czemu cały bufor będzie nadający się do użytku), a pozycja na 0.Tak więc typowy scenariusz użycia:
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); }
źródło
WritableByteChannel
, na przykładFileChannel
lubSocketChannel
.write(ByteBuffer)
metodę. (Nie ma znaczenia, jaki jest jego typ ...)Buffer.clear
który zresetować limit pojemności i pozycję do 0.Buffer.reset
resetować tylko pozycję domark
.Odwróć przypisuje bieżącą wartość pozycji do właściwości limit i ustawia właściwość pozycji na 0. Odwróć jest użyteczne, aby usunąć tylko aktywne elementy z bufora.
Na przykład, poniższy program wypisuje "hello", a nie puste elementy bufora. Limit wywołań metod i pozycja można zastąpić klapką.
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()); }
Więcej informacji na temat buforów i kanałów można znaleźć pod adresem http://www.zoftino.com/java-nio-tutorial .
źródło
ByteBuffer jest źle zaprojektowany. Jest wiele skarg od porządnych programistów.
Więc nie próbuj tego rozumować, po prostu przestudiuj i uważnie korzystaj z API.
Teraz nie mogę tego oszukać bez przedstawienia alternatywy, więc oto jest:
Bufor ma stałą
capacity
; zachowuje 2 wskaźniki:start
iend
.get()
zwraca bajt nastart
pozycji i zwiększastart
.put()
umieszcza bajt naend
pozycji i zwiększaend
. Nieflip()
!źródło
metoda flip () przygotowuje bufor na nową sekwencję operacji zapisu kanałowego lub względnego pobierania: ustawia limit na bieżącą pozycję, a następnie ustawia pozycję na zero.
Bufor śledzi zapisane w nim dane. W celu przełączenia się z trybu pisania do trybu czytania wywoływana jest metoda flip () post writing .
źródło