ByteBuffer'ın çevirme yönteminin amacı nedir? (Ve neden buna "flip" deniyor?)


95

ByteBuffer'ın flip () yöntemi neden "flip" olarak adlandırılıyor? Burada "çevrilen" nedir? Apidoc'a göre, birbirini izleyen iki çevirme orijinal durumu geri getirmeyecek ve birden çok çevirme muhtemelen limit()sıfır olma eğiliminde olacaktır .

Baytları yeniden kullanmak için bir şekilde sınırı aşabilir miyim?

Kuyruğu başka verilerle çevrilecek şekilde birleştirebilir miyim?


5
Arabelleği okumadan yazmaya (ve tersi) "çevirir". thushw.blogspot.com/2009/10/…
Brian Roach

2
@BrianRoach: Okumadan yazmaya geçer, ancak sabit boyutlu yapılar yazmadığınız sürece okumak için yazmak için kullanışlı değildir. Yazmak ve okumak için çevirmek için resetkullanın.
nneonneo

"Objektif" sorular sormayı unutmayın; veya en azından, baskın sorunun objektif görünmesini

@nneonneo - Hiç sorgusuz sualsizdi, ayrıntıları açıklamak için pek zaman harcamayacaktı, dolayısıyla sadece bir yorum ve bir bağlantı.
Brian Roach

Yanıtlar:


130

İçin oldukça yaygın bir kullanım durumu, ByteBufferbazı veri yapılarını parça parça inşa etmek ve daha sonra tüm yapıyı diske yazmaktır. flipçevirmek için kullanılan ByteBuffer"I / O okuma" (den putiçin ting) "I yazma / O" ( gettim) bir dizi sonra puts doldurmak için kullanılır ByteBuffer, flipmevcut konumuna göre tampon sınırı koyacaktır ve konumu sıfırlayın. Bu, bir gelecek yapma etkisine sahiptir getya writeda arabellekten tüm olanı arabelleğe yazıp putdaha fazlasını değil.

Bitirdikten sonra put, ByteBufferbaşka bir veri yapısı oluşturmak için yeniden kullanmak isteyebilirsiniz . "Açmak" için arayın clear. Bu, kapasitenin sınırını (tamponun tamamını kullanılabilir hale getirir) ve konumu 0'a sıfırlar.

Dolayısıyla, tipik bir kullanım senaryosu:

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

Bir tür nedir out?
Suzan Cioc

6
Ya da write(ByteBuffer)yöntemi olan herhangi bir şey . (Türünün ne olduğu gerçekten alakalı değil ...)
Stephen C

1
Gelmeli Buffer.clearkapasite ve pozisyona sıfırlama limiti 0. için Buffer.resetsıfırlanır sadece pozisyon mark.
Kelvin Ng

1
@KelvinNg: Haklısın; Cevabı bunu yansıtacak şekilde değiştirdim. Güzel yakaladığın için teşekkürler!
nneonneo

1
@ user963241: okuma gelen I / tampon içerisinde, O, yazma gelen I / O içine tampon.
nneonneo

7

Flip, limit özelliğine geçerli konum değerini atar ve position özelliğini 0 olarak ayarlar. Çevir, yalnızca aktif öğeleri bir arabellekten boşaltmak için kullanışlıdır.

Örneğin, aşağıdaki program arabelleğin boş öğelerini değil "merhaba" ifadesini yazdırır. Yöntem çağrıları limiti ve pozisyonu flip ile değiştirilebilir.

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

Tamponlar ve kanallar hakkında daha fazla bilgi için http://www.zoftino.com/java-nio-tutorial adresine bakın .


Çok kapsamlı kapsama bağlantı için teşekkür ederiz! Kaynaklar dahil edildiğinde çok harika. Java API dokümanları, sanki yaygın bir bilgisayar bilimi terimiymiş gibi, açıklama olmadan 'çevirme' kelimesini kullanıyor gibiydi, ancak belli ki birkaç kişi (ben de dahil olmak üzere) durumun böyle olduğunu bulamadı.
John Meyer

3

ByteBuffer kötü tasarlanmış. İyi programcılardan çok sayıda şikayet var.

Bu yüzden bunun hakkında mantık yürütmeye çalışmayın, sadece API'yi dikkatlice çalışın ve kullanın.

Şimdi bir alternatif sunmadan kötü söz söyleyemem, işte burada:

Bir tamponda sabit capacity; 2 işaretçi tutar: startve end. get()baytı startkonum ve artışlarla döndürür start. put()baytı endkonuma ve artışlara koyar end. Hayır flip()!


6
Peki şikayetler neler? Eğer kişisel bir şikayetiniz varsa, bu da sorun değil, ancak "X API berbat, insanlar öyle dedi" demekle yetinmez.
nneonneo

13
Bu bağlantıyı göndermek, kelimenin tam anlamıyla ilk etapta yapmanız gereken tek şey. Sizi asla yalan söylemekle suçlamadım, sadece şikayetlerin kaynağı ve niteliği hakkında ayrıntılı bilgi vermenizi istedim.
nneonneo

2
burası insanların gönüllü olarak, istedikleri kadar çaba göstererek yardım ettikleri bir yerdir. Her cevabı iyi araştırılmış akademik bir makaleye dönüştürmeme gerek yok.
reddedilemez

8
ve burası aynı zamanda insanların inandırıcı gelmedikçe birinin sözünü dinlemeyecekleri bir yerdir.
arunmoezhi

8
Kaynak vermenize bile gerek yok. ByteBuffer'ın kötü tasarlanmış olduğu apaçık ortada. flip bir amacı karşılamaz, sadece çevirmeyi unuttuğunuzda bir hata kaynağı sunar. Eğer onu yerleştirmek için kontrol edilemeyen bir dürtü hissediyorlarsa, en azından ters çevrilmiş ve açılmış ByteBuffers'ı farklı sınıflar yapın, böylece tip sistemi hataları yakalayabilir.
Gurgeh

0

flip () yöntemi, bir arabelleği yeni bir kanal yazma veya göreceli alma işlemleri dizisi için hazır hale getirir: Sınırı geçerli konuma ayarlar ve ardından konumu sıfıra ayarlar.

Buffer, içine yazılan verilerin kaydını tutar. Yazı yazma, yazma modundan okuma moduna geçmek için flip () yöntemi çağrılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.