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?
java
flip
bytebuffer
Suzan Cioc
sumber
sumber
reset
sebagai gantinya.Jawaban:
Salah satu kasus penggunaan yang cukup umum untuk the
ByteBuffer
adalah untuk membuat beberapa struktur data sepotong demi sepotong dan kemudian menulis seluruh struktur itu ke disk.flip
digunakan untuk membalikkanByteBuffer
dari "membaca dari I / O" (put
ting) ke "menulis ke I / O" (get
ting): setelah urutanput
s digunakan untuk mengisiByteBuffer
,flip
akan mengatur batas buffer ke posisi saat ini dan setel ulang posisi ke nol. Ini memiliki efek membuat masa depanget
atauwrite
dari buffer menulis semua apa yang adaput
di buffer dan tidak lebih.Setelah menyelesaikan
put
, Anda mungkin ingin menggunakan kembaliByteBuffer
untuk membuat struktur data lain. Untuk "melepaskannya", panggilclear
. 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); }
sumber
out
?write(ByteBuffer)
metode. (Tidak terlalu relevan apa jenisnya ...)Buffer.clear
yang mengatur ulang batas kapasitas dan posisi ke 0.Buffer.reset
hanya mengatur ulang posisi kemark
.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.
sumber
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:start
danend
.get()
mengembalikan byte padastart
posisi dan kenaikanstart
.put()
menempatkan byte padaend
posisi dan kenaikanend
. Tidakflip()
!sumber
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.
sumber