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