Java NIO - บัฟเฟอร์
บัฟเฟอร์ใน Java NIO สามารถถือว่าเป็นอ็อบเจ็กต์ธรรมดาซึ่งทำหน้าที่เป็นคอนเทนเนอร์ขนาดคงที่ของชิ้นข้อมูลที่สามารถใช้ในการเขียนข้อมูลไปยังแชนเนลหรืออ่านข้อมูลจากแชนเนลเพื่อให้บัฟเฟอร์ทำหน้าที่เป็นจุดสิ้นสุดของแชนเนล
มีชุดวิธีการที่ทำให้สะดวกในการจัดการกับบล็อกหน่วยความจำเพื่ออ่านและเขียนข้อมูลเข้าและออกจากช่องสัญญาณ
บัฟเฟอร์ทำให้แพ็กเกจ NIO มีประสิทธิภาพมากขึ้นและเร็วขึ้นเมื่อเทียบกับ IO แบบคลาสสิกเนื่องจากในกรณีของข้อมูล IO จะถูกจัดการในรูปแบบของสตรีมที่ไม่รองรับการไหลของข้อมูลแบบอะซิงโครนัสและพร้อมกันนอกจากนี้ IO ยังไม่อนุญาตให้เรียกใช้ข้อมูลเป็นกลุ่มหรือกลุ่มไบต์ .
พารามิเตอร์หลักที่กำหนดบัฟเฟอร์ Java NIO สามารถกำหนดเป็น -
Capacity - จำนวนข้อมูล / ไบต์สูงสุดที่สามารถจัดเก็บในบัฟเฟอร์ได้ไม่สามารถเปลี่ยนแปลงความจุของบัฟเฟอร์ได้เมื่อบัฟเฟอร์เต็มแล้วควรล้างข้อมูลก่อนที่จะเขียนลงไป
Limit - Limit มีความหมายตามโหมดของ Buffer เช่นในโหมดการเขียนของ Buffer Limit เท่ากับความจุซึ่งหมายความว่าข้อมูลสูงสุดที่สามารถเขียนในบัฟเฟอร์ได้ในขณะที่อยู่ในโหมดอ่านของ buffer Limit หมายถึงขีด จำกัด ของข้อมูลที่สามารถมีได้ อ่านจากบัฟเฟอร์
Position - ชี้ไปยังตำแหน่งปัจจุบันของเคอร์เซอร์ในบัฟเฟอร์ตั้งค่าเริ่มต้นเป็น 0 ในขณะที่สร้างบัฟเฟอร์หรือกล่าวอีกนัยหนึ่งคือดัชนีขององค์ประกอบถัดไปที่จะอ่านหรือเขียนซึ่งได้รับการอัปเดตโดยอัตโนมัติโดย get () และใส่ ( ) วิธีการ
Mark - ทำเครื่องหมายบุ๊กมาร์กของตำแหน่งในบัฟเฟอร์เมื่อเมธอด mark () เรียกว่าตำแหน่งปัจจุบันจะถูกบันทึกและเมื่อรีเซ็ต () เรียกว่าตำแหน่งที่ทำเครื่องหมายไว้จะถูกเรียกคืน
ประเภทบัฟเฟอร์
Java NIO บัฟเฟอร์สามารถจำแนกได้ตามรูปแบบต่อไปนี้บนพื้นฐานของประเภทข้อมูลที่บัฟเฟอร์เกี่ยวข้องกับ -
- ByteBuffer
- MappedByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
วิธีการสำคัญของ Buffer
ดังที่ได้กล่าวไปแล้วว่า Buffer ทำหน้าที่เป็นหน่วยความจำซึ่งจัดเตรียมชุดวิธีการที่ช่วยให้จัดการกับบล็อกหน่วยความจำได้สะดวกยิ่งขึ้นต่อไปนี้เป็นวิธีการที่สำคัญของ Buffer -
allocate(int capacity) - วิธีนี้ใช้เพื่อจัดสรรบัฟเฟอร์ใหม่ที่มีความจุเป็นพารามิเตอร์เมธอด Allocate จะพ่น IllegalArgumentException ในกรณีที่ความจุที่ส่งผ่านเป็นจำนวนเต็มลบ
read() and put() - วิธีการอ่านของช่องใช้ในการเขียนข้อมูลจากช่องสัญญาณไปยังบัฟเฟอร์ในขณะที่ put เป็นวิธีการบัฟเฟอร์ที่ใช้ในการเขียนข้อมูลในบัฟเฟอร์
flip() - วิธีการพลิกจะเปลี่ยนโหมดของ Buffer จากการเขียนเป็นโหมดการอ่านนอกจากนี้ยังตั้งค่าตำแหน่งกลับเป็น 0 และกำหนดขีด จำกัด ว่าตำแหน่งอยู่ที่ใดในขณะที่เขียน
write() and get() - วิธีการเขียนของช่องใช้ในการเขียนข้อมูลจากบัฟเฟอร์ไปยังช่องสัญญาณในขณะที่ get เป็นวิธีการของบัฟเฟอร์ที่ใช้ในการอ่านข้อมูลจากบัฟเฟอร์
rewind() - ใช้วิธีการย้อนกลับเมื่อจำเป็นต้องอ่านซ้ำเนื่องจากตั้งค่าตำแหน่งกลับเป็นศูนย์และไม่เปลี่ยนค่าของขีด จำกัด
clear() and compact() - ใช้ทั้งสองวิธีที่ชัดเจนและกะทัดรัดเพื่อสร้างบัฟเฟอร์จากโหมดอ่านเป็นเขียนclear() วิธีการทำให้ตำแหน่งเป็นศูนย์และขีด จำกัด เท่ากับความจุในวิธีนี้ข้อมูลในบัฟเฟอร์จะไม่ถูกล้างเฉพาะเครื่องหมายที่ได้รับการเริ่มต้นใหม่
ในทางกลับกัน compact() วิธีนี้ใช้เมื่อยังคงมีข้อมูลที่ยังไม่ได้อ่านและเรายังคงใช้โหมดการเขียนของบัฟเฟอร์ในกรณีนี้วิธีการที่กะทัดรัดจะคัดลอกข้อมูลที่ยังไม่ได้อ่านทั้งหมดไปยังจุดเริ่มต้นของบัฟเฟอร์และตั้งค่าตำแหน่งไปทางขวาหลังจากองค์ประกอบสุดท้ายที่ยังไม่ได้อ่านคุณสมบัติขีด จำกัด ยังคงอยู่ ตั้งค่าเป็นความจุ
mark() and reset() - เนื่องจากวิธีการทำเครื่องหมายชื่อแนะนำใช้เพื่อทำเครื่องหมายตำแหน่งใด ๆ ในบัฟเฟอร์ในขณะที่รีเซ็ตทำให้ตำแหน่งกลับไปที่ตำแหน่งที่ทำเครื่องหมายไว้
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงการนำวิธีการที่กำหนดไว้ข้างต้นไปใช้
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
public class BufferDemo {
public static void main (String [] args) {
//allocate a character type buffer.
CharBuffer buffer = CharBuffer.allocate(10);
String text = "bufferDemo";
System.out.println("Input text: " + text);
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
//put character in buffer.
buffer.put(c);
}
int buffPos = buffer.position();
System.out.println("Position after data is written into buffer: " + buffPos);
buffer.flip();
System.out.println("Reading buffer contents:");
while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
//set the position of buffer to 5.
buffer.position(5);
//sets this buffer's mark at its position
buffer.mark();
//try to change the position
buffer.position(6);
//calling reset method to restore to the position we marked.
//reset() raise InvalidMarkException if either the new position is less
//than the position marked or merk has not been setted.
buffer.reset();
System.out.println("Restored buffer position : " + buffer.position());
}
}
เอาต์พุต
Input text: bufferDemo
Position after data is written into buffer: 10
Reading buffer contents:
b
u
f
f
e
r
D
e
m
o
Restored buffer position : 5