Apa tujuan dari metode flip ByteBuffer? (Dan mengapa ini disebut "flip"?)

95

Mengapa metode flip () ByteBuffer disebut "flip"? Apa yang "dibalik" di sini? Menurut apidoc, dua pembalikan yang berurutan tidak akan memulihkan keadaan semula, dan beberapa pembalikan kemungkinan akan cenderung limit()menjadi nol.

Dapatkah saya "membuka flip" untuk menggunakan kembali byte yang melampaui batas?

Dapatkah saya menggabungkan ekor untuk dibalik dengan beberapa data lain?

Suzan Cioc
sumber
5
Ini "membalik" buffer dari baca ke tulis (dan sebaliknya). thushw.blogspot.com/2009/10/…
Brian Roach
2
@BrianRoach: Ini membalik dari baca ke tulis tetapi tidak berguna untuk menulis ke membaca kecuali Anda menulis struktur ukuran tetap. Untuk membalik untuk menulis untuk membaca, gunakan resetsebagai gantinya.
nneonneo
Ingatlah untuk mengajukan pertanyaan "objektif"; atau, setidaknya, buat pertanyaan utama tampak objektif: D
@nneonneo - Itu bukan pertanyaan, tidak benar-benar akan menghabiskan banyak waktu untuk menjelaskan detailnya, karena itu hanya komentar dan tautan.
Brian Roach

Jawaban:

130

Salah satu kasus penggunaan yang cukup umum untuk the ByteBufferadalah untuk membuat beberapa struktur data sepotong demi sepotong dan kemudian menulis seluruh struktur itu ke disk. flipdigunakan untuk membalikkan ByteBufferdari "membaca dari I / O" ( putting) ke "menulis ke I / O" ( getting): setelah urutan puts digunakan untuk mengisi ByteBuffer, flipakan mengatur batas buffer ke posisi saat ini dan setel ulang posisi ke nol. Ini memiliki efek membuat masa depan getatau writedari buffer menulis semua apa yang ada putdi buffer dan tidak lebih.

Setelah menyelesaikan put, Anda mungkin ingin menggunakan kembali ByteBufferuntuk membuat struktur data lain. Untuk "melepaskannya", panggil clear. Ini mengatur ulang batas kapasitas (membuat semua buffer dapat digunakan), dan posisi ke 0.

Jadi, skenario penggunaan tipikal:

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);
}
nneonneo
sumber
Apa tipe dari out?
Suzan Cioc
6
Atau apa pun yang memiliki write(ByteBuffer)metode. (Tidak terlalu relevan apa jenisnya ...)
Stephen C
1
Harus Buffer.clearyang mengatur ulang batas kapasitas dan posisi ke 0. Buffer.resethanya mengatur ulang posisi ke mark.
Kelvin Ng
1
@KelvinNg: Anda benar; Saya telah mengubah jawaban untuk mencerminkan ini. Terima kasih untuk tangkapan yang bagus!
nneonneo
1
@ user963241: membaca dari I / O ke buffer, menulis dari buffer ke I / O.
nneonneo
7

Flip memberikan nilai posisi saat ini ke properti batas dan menyetel properti posisi ke 0. Flip berguna untuk hanya menguras elemen aktif dari buffer.

Misalnya, program di bawah ini mencetak "halo" bukan elemen buffer kosong. Batas dan posisi panggilan metode dapat diganti dengan flip.

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

Lihat http://www.zoftino.com/java-nio-tutorial untuk informasi lebih lanjut tentang buffer dan saluran.

Arnav Rao
sumber
Terima kasih untuk link ke liputan yang sangat luas! Sangat bagus ketika sumber disertakan. Dokumen java API sepertinya menggunakan kata 'flip' tanpa penjelasan, seolah-olah itu adalah istilah ilmu komputer yang umum, tetapi jelas beberapa orang (termasuk saya) belum menemukannya.
John Meyer
3

ByteBuffer dirancang dengan buruk. Ada banyak keluhan dari programmer yang baik.

Jadi jangan coba-coba memikirkannya, pelajari saja dan gunakan API dengan hati-hati.

Sekarang saya tidak bisa menjelek-jelekkannya tanpa memberikan alternatif, jadi ini dia:

Buffer memiliki tetap capacity; itu mempertahankan 2 petunjuk: startdan end. get()mengembalikan byte pada startposisi dan kenaikan start. put()menempatkan byte pada endposisi dan kenaikan end. Tidak flip()!

tak ternilai
sumber
6
Lantas, apa saja keluhannya? Jika Anda memiliki keluhan pribadi, tidak apa-apa juga, tetapi tidak cukup hanya mengatakan "X API menyebalkan, orang mengatakan begitu".
nneonneo
13
Memposting tautan itu secara harfiah adalah semua yang harus Anda lakukan sejak awal. Saya tidak pernah menuduh Anda berbohong, saya hanya meminta Anda menjelaskan sumber dan sifat pengaduan.
nneonneo
2
ini hanyalah tempat di mana orang menawarkan bantuan mereka secara sukarela, dengan jumlah usaha yang mereka pilih. Saya tidak perlu mengembangkan setiap jawaban menjadi makalah akademis yang diteliti dengan baik.
bereputasi
8
dan ini juga tempat di mana orang tidak akan mengambil kata-kata seseorang kecuali terdengar kredibel.
arunmoezhi
8
Anda bahkan tidak perlu memberikan sumber. Jelas sekali bahwa ByteBuffer dirancang dengan buruk. flip tidak memenuhi suatu tujuan, itu hanya memperkenalkan sumber bug ketika Anda lupa membalik. Jika mereka merasakan dorongan yang tak terkendali untuk memasukkannya, setidaknya buat ByteBuffers yang dibalik dan dibuka kelasnya berbeda, sehingga sistem tipe dapat menangkap bug.
Gurgeh
0

flip () metode membuat buffer siap untuk urutan baru dari saluran-tulis atau operasi relatif get: Ini menetapkan batas ke posisi saat ini dan kemudian mengatur posisi ke nol.

Buffer melacak data yang tertulis di dalamnya. Post writing, metode flip () dipanggil untuk beralih dari mode menulis ke membaca.

vkohli
sumber