จุดประสงค์ของวิธีการพลิกของ ByteBuffer คืออะไร? (และทำไมถึงเรียกว่า "พลิก")


95

ทำไมวิธีการ flip () ของ ByteBuffer จึงเรียกว่า "flip"? "พลิก" ที่นี่คืออะไร? ตาม apidoc การพลิกสองครั้งต่อเนื่องจะไม่คืนสถานะดั้งเดิมและการพลิกหลายครั้งอาจlimit()จะกลายเป็นศูนย์

ฉันจะ "คลายการพลิก" เพื่อนำไบต์กลับมาใช้ใหม่ได้หรือไม่

ฉันสามารถต่อหางเพื่อพลิกกับข้อมูลอื่นได้หรือไม่?


5
มัน "พลิก" บัฟเฟอร์จากอ่านเป็นเขียน (และในทางกลับกัน) thushw.blogspot.com/2009/10/…
Brian Roach

2
@BrianRoach: มันพลิกจากอ่านเป็นเขียน แต่ไม่มีประโยชน์สำหรับเขียนเป็นอ่านเว้นแต่คุณจะเขียนโครงสร้างขนาดคงที่ สำหรับการพลิกเพื่อเขียนเพื่ออ่านให้ใช้resetแทน
nneonneo

อย่าลืมถามคำถาม "วัตถุประสงค์"; หรืออย่างน้อยก็ทำให้คำถามเด่นดูมีวัตถุประสงค์: D

@nneonneo - มันไม่ใช่คำถามไม่ได้ใช้เวลามากในการอธิบายรายละเอียดดังนั้นจึงเป็นเพียงความคิดเห็นและลิงค์
Brian Roach

คำตอบ:


130

กรณีการใช้งานทั่วไปอย่างหนึ่งสำหรับการByteBufferสร้างโครงสร้างข้อมูลทีละชิ้นแล้วเขียนโครงสร้างทั้งหมดลงดิสก์ flipจะใช้ในการพลิกByteBufferจาก "การอ่านจาก I / O" ( putทิ้ง) เพื่อ "เขียน I / O" ( getการใช้งาน): หลังจากลำดับของputs จะใช้ในการเติมByteBuffer, flipจะกำหนดวงเงินของบัฟเฟอร์ไปยังตำแหน่งปัจจุบัน และรีเซ็ตตำแหน่งเป็นศูนย์ สิ่งนี้มีผลในการสร้างอนาคตgetหรือwriteจากบัฟเฟอร์เขียนสิ่งที่อยู่putในบัฟเฟอร์ทั้งหมดและไม่มีอีกต่อไป

หลังจากเสร็จสิ้นputคุณอาจต้องการใช้ซ้ำByteBufferเพื่อสร้างโครงสร้างข้อมูลอื่น หากต้องการ "พลิก" โทรclear. สิ่งนี้จะรีเซ็ตขีด จำกัด เป็นความจุ (ทำให้บัฟเฟอร์ทั้งหมดสามารถใช้งานได้) และตำแหน่งเป็น 0

ดังนั้นสถานการณ์การใช้งานทั่วไป:

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

ประเภทของoutอะไร?
Suzan Cioc

6
หรืออย่างอื่นที่มีwrite(ByteBuffer)วิธี. (ไม่เกี่ยวจริงๆว่ามันคือประเภทอะไร ... )
Stephen C

1
มันควรจะเป็นBuffer.clearซึ่งขีด จำกัด การตั้งค่าความจุและตำแหน่ง 0 ตำแหน่งเท่านั้นรีเซ็ตBuffer.reset mark
Kelvin Ng

1
@KelvinNg: คุณพูดถูก; ฉันได้แก้ไขคำตอบเพื่อสะท้อนสิ่งนี้ ขอบคุณสำหรับการจับที่ดี!
nneonneo

1
@ user963241: อ่านจาก I / O เป็นบัฟเฟอร์เขียนจากบัฟเฟอร์ลงใน I / O
nneonneo

7

Flip กำหนดค่าตำแหน่งปัจจุบันให้กับคุณสมบัติ จำกัด และตั้งค่าคุณสมบัติตำแหน่งเป็น 0 Flip มีประโยชน์ในการระบายองค์ประกอบที่ใช้งานออกจากบัฟเฟอร์เท่านั้น

ตัวอย่างเช่นด้านล่างโปรแกรมจะพิมพ์ "hello" ไม่ใช่องค์ประกอบของบัฟเฟอร์ที่ว่างเปล่า วิธีการ จำกัด การโทรและตำแหน่งสามารถถูกแทนที่ด้วยการพลิก

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

ดูhttp://www.zoftino.com/java-nio-tutorialสำหรับข้อมูลเพิ่มเติมเกี่ยวกับบัฟเฟอร์และช่อง


ขอบคุณสำหรับลิงก์ไปยังการรายงานข่าวที่ครอบคลุมมาก! มันยอดเยี่ยมมากเมื่อรวมแหล่งที่มา เอกสาร java API ดูเหมือนจะใช้คำว่า 'flip' โดยไม่มีคำอธิบายราวกับว่ามันเป็นศัพท์วิทยาศาสตร์คอมพิวเตอร์ทั่วไป แต่เห็นได้ชัดว่ามีคนไม่กี่คน (รวมถึงฉัน) ไม่พบว่าเป็นเช่นนั้น
John Meyer

3

ByteBuffer ออกแบบมาไม่ดี มีข้อร้องเรียนมากมายจากโปรแกรมเมอร์ที่ดี

ดังนั้นอย่าพยายามหาเหตุผลเพียงแค่ศึกษาและใช้ API อย่างรอบคอบ

ตอนนี้ฉันไม่สามารถ badmouth ได้โดยไม่ต้องนำเสนอทางเลือกดังนั้นนี่คือ:

บัฟเฟอร์ได้คงที่capacity; มันรักษา 2 พอยน์เตอร์: startและend. get()ส่งกลับไบต์ที่ตำแหน่งและการเพิ่มขึ้นstart ทำให้ไบต์ที่ตำแหน่งและการเพิ่มขึ้น ไม่!startput()endendflip()


6
ดังนั้นข้อร้องเรียนคืออะไร? หากคุณมีข้อข้องใจส่วนตัวบางอย่างก็ใช้ได้เช่นกัน แต่ไม่ได้มีเพียงแค่พูดว่า "X API แย่แล้วคนก็พูดอย่างนั้น"
nneonneo

13
การโพสต์ลิงก์นั้นเป็นสิ่งที่คุณต้องทำตั้งแต่แรก ฉันไม่เคยกล่าวหาว่าคุณโกหกฉันเพียงขอให้คุณอธิบายอย่างละเอียดเกี่ยวกับแหล่งที่มาและลักษณะของข้อร้องเรียน
nneonneo

2
นี่เป็นเพียงสถานที่ที่ผู้คนเสนอความช่วยเหลือด้วยความสมัครใจด้วยความพยายามที่เหมาะสม ฉันไม่จำเป็นต้องขยายคำตอบแต่ละข้อลงในเอกสารวิชาการที่ค้นคว้ามาอย่างดี
ปฏิเสธได้

8
และที่นี่ยังเป็นสถานที่ที่ผู้คนจะไม่ยอมรับคำพูดของใครบางคนเว้นแต่จะฟังดูน่าเชื่อถือ
arunmoezhi

8
คุณไม่จำเป็นต้องให้แหล่งข้อมูล เห็นได้ชัดว่า ByteBuffer ออกแบบมาไม่ดี การพลิกไม่ได้เติมเต็มจุดประสงค์ แต่เพียงแค่แนะนำแหล่งที่มาของจุดบกพร่องเมื่อคุณลืมพลิก หากพวกเขารู้สึกว่ามีแรงกระตุ้นที่ไม่สามารถควบคุมได้ที่จะใส่เข้าไปอย่างน้อยก็ให้สร้าง ByteBuffers คลาสที่แตกต่างกันและพลิกกลับเพื่อให้ระบบประเภทสามารถจับข้อบกพร่องได้
Gurgeh

0

วิธีการflip ()ทำให้บัฟเฟอร์พร้อมสำหรับลำดับใหม่ของการดำเนินการเขียนช่องสัญญาณหรือการรับสัมพัทธ์: ตั้งค่าขีด จำกัด ไว้ที่ตำแหน่งปัจจุบันจากนั้นตั้งค่าตำแหน่งเป็นศูนย์

บัฟเฟอร์ติดตามข้อมูลที่เขียนลงในนั้น การเขียนโพสต์วิธีflip ()เรียกว่าเพื่อเปลี่ยนจากการเขียนเป็นโหมดการอ่าน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.