แอปพลิเคชันตัวอย่างสำหรับ a ByteBuffer
ใน Java มีอะไรบ้าง โปรดแสดงรายการตัวอย่างสถานการณ์ที่ใช้สิ่งนี้ ขอบคุณ!
แอปพลิเคชันตัวอย่างสำหรับ a ByteBuffer
ใน Java มีอะไรบ้าง โปรดแสดงรายการตัวอย่างสถานการณ์ที่ใช้สิ่งนี้ ขอบคุณ!
คำตอบ:
นี่เป็นคำอธิบายที่ดีเกี่ยวกับการใช้งานและข้อบกพร่อง คุณจำเป็นต้องใช้มันทุกครั้งที่คุณต้องทำ I / O ระดับต่ำอย่างรวดเร็ว หากคุณกำลังจะใช้โปรโตคอล TCP / IP หรือหากคุณกำลังเขียนฐานข้อมูล (DBMS) คลาสนี้จะมีประโยชน์
คลาส ByteBuffer มีความสำคัญเนื่องจากเป็นพื้นฐานสำหรับการใช้งานช่องทางใน Java คลาสByteBufferกำหนดหกหมวดหมู่ของการดำเนินการตามบัฟเฟอร์ไบต์ตามที่ระบุไว้ในเอกสาร Java 7 :
วิธีการรับจำนวนมากที่สัมพันธ์ที่ถ่ายโอนลำดับที่ต่อเนื่องของไบต์จากบัฟเฟอร์นี้ลงในอาร์เรย์
วิธีใส่จำนวนมากแบบสัมพันธ์ที่ถ่ายโอนลำดับที่ต่อเนื่องกันของไบต์จากอาร์เรย์ไบต์หรือบัฟเฟอร์ไบต์อื่น ๆ ลงในบัฟเฟอร์นี้
วิธีรับและใส่ค่าสัมบูรณ์และสัมพัทธ์ที่อ่านและเขียนค่าของชนิดดั้งเดิมอื่น ๆ แปลพวกเขาไปและกลับจากลำดับของไบต์ตามลำดับไบต์เฉพาะ
วิธีการในการสร้างบัฟเฟอร์มุมมองซึ่งอนุญาตให้ดูบัฟเฟอร์ไบต์เป็นบัฟเฟอร์ที่มีค่าประเภทอื่น ๆ ดั้งเดิม และ
Example code : Putting Bytes into a buffer.
// Create an empty ByteBuffer with a 10 byte capacity
ByteBuffer bbuf = ByteBuffer.allocate(10);
// Get the buffer's capacity
int capacity = bbuf.capacity(); // 10
// Use the absolute put(int, byte).
// This method does not affect the position.
bbuf.put(0, (byte)0xFF); // position=0
// Set the position
bbuf.position(5);
// Use the relative put(byte)
bbuf.put((byte)0xFF);
// Get the new position
int pos = bbuf.position(); // 6
// Get remaining byte count
int rem = bbuf.remaining(); // 4
// Set the limit
bbuf.limit(7); // remaining=1
// This convenience method sets the position to 0
bbuf.rewind(); // remaining=7
Java IO ที่ใช้ stream oriented APIs ดำเนินการโดยใช้บัฟเฟอร์เป็นที่เก็บข้อมูลชั่วคราวภายในพื้นที่ผู้ใช้ ข้อมูลที่อ่านจากดิสก์โดย DMA จะถูกคัดลอกไปยังบัฟเฟอร์ในพื้นที่เคอร์เนลก่อนแล้วจึงโอนไปยังบัฟเฟอร์ในพื้นที่ผู้ใช้ ดังนั้นจึงมีค่าใช้จ่าย การหลีกเลี่ยงมันสามารถทำให้ได้ประสิทธิภาพที่เพิ่มขึ้นอย่างมาก
เราสามารถข้ามบัฟเฟอร์ชั่วคราวนี้ในพื้นที่ผู้ใช้หากมีวิธีเข้าถึงบัฟเฟอร์ในพื้นที่เคอร์เนลโดยตรง Java NIO จัดเตรียมวิธีในการทำเช่นนั้น
ByteBuffer
เป็นหนึ่งในหลายบัฟเฟอร์ที่จัดทำโดย Java NIO มันเป็นเพียงภาชนะหรือถังเก็บเพื่ออ่านข้อมูลจากหรือเขียนข้อมูลไป พฤติกรรมดังกล่าวสามารถทำได้โดยการจัดสรรบัฟเฟอร์โดยตรงโดยใช้allocateDirect()
API บนบัฟเฟอร์
ใน Android คุณสามารถสร้างบัฟเฟอร์ที่ใช้ร่วมกันระหว่าง C ++ และ Java (ด้วยวิธี directAlloc) และจัดการมันทั้งสองด้าน
นี่คือบทความที่ยอดเยี่ยมที่อธิบายประโยชน์ของ ByteBuffer ต่อไปนี้เป็นประเด็นสำคัญในบทความ:
ต่อไปนี้เป็นสิทธิประโยชน์สำหรับ ByteBuffer / MappedByteBuffer โดยตรง โปรดทราบว่าบัฟเฟอร์โดยตรงถูกสร้างขึ้นนอกฮีป:
ไม่ได้รับผลกระทบจาก gc cycles : บัฟเฟอร์โดยตรงจะไม่ถูกย้ายระหว่างรอบการรวบรวมขยะเนื่องจากอยู่นอก heap เทคโนโลยีการแคชBigMemoryของTerraCotaดูเหมือนจะพึ่งพาข้อได้เปรียบนี้เป็นอย่างมาก หากพวกเขาอยู่ในกองมันจะชะลอตัวลง gc เวลาหยุดชั่วคราว
การเพิ่มประสิทธิภาพ : ในสตรีม IO การอ่านเพื่อเรียกใช้จะทำให้เกิดการเรียกใช้ระบบซึ่งต้องการการสลับบริบทระหว่างผู้ใช้ไปยังโหมดเคอร์เนลและในทางกลับกันซึ่งจะมีค่าใช้จ่ายสูงโดยเฉพาะหากไฟล์ถูกเข้าถึงอย่างต่อเนื่อง อย่างไรก็ตามด้วยการแมปหน่วยความจำการสลับบริบทนี้จะลดลงเนื่องจากข้อมูลมีแนวโน้มที่จะพบได้ในหน่วยความจำ (MappedByteBuffer) หากข้อมูลมีอยู่ในหน่วยความจำข้อมูลจะถูกเข้าถึงโดยตรงโดยไม่ต้องเรียกใช้ OS เช่นไม่มีการสลับบริบท
โปรดทราบว่า MappedByteBuffers นั้นมีประโยชน์มากโดยเฉพาะอย่างยิ่งหากไฟล์มีขนาดใหญ่และกลุ่มบล็อกจำนวนน้อยสามารถเข้าถึงได้บ่อยขึ้น