Java NIO - Bộ đệm

Bộ đệm trong Java NIO có thể được coi như một đối tượng đơn giản hoạt động như một vùng chứa các khối dữ liệu có kích thước cố định có thể được sử dụng để ghi dữ liệu vào kênh hoặc đọc dữ liệu từ kênh để bộ đệm hoạt động như điểm cuối của các kênh.

Nó cung cấp tập hợp các phương pháp giúp thuận tiện hơn khi xử lý khối bộ nhớ để đọc và ghi dữ liệu vào và từ các kênh.

Bộ đệm làm cho gói NIO hiệu quả hơn và nhanh hơn so với IO cổ điển vì trong trường hợp dữ liệu IO được xử lý ở dạng luồng không hỗ trợ luồng dữ liệu không đồng bộ và đồng thời. Ngoài ra IO không cho phép thực thi dữ liệu theo đoạn hoặc nhóm byte .

Các tham số chính xác định bộ đệm Java NIO có thể được định nghĩa là:

  • Capacity - Số lượng dữ liệu / byte tối đa có thể được lưu trữ trong Bộ đệm. Dung lượng của bộ đệm không thể bị thay đổi. Khi bộ đệm đầy, nó nên được xóa trước khi ghi vào nó.

  • Limit - Giới hạn có nghĩa là theo chế độ của Bộ đệm tức là trong chế độ ghi của Bộ đệm Giới hạn bằng dung lượng có nghĩa là dữ liệu tối đa có thể được ghi trong bộ đệm. Trong khi ở chế độ đọc của bộ đệm, Giới hạn có nghĩa là giới hạn số lượng dữ liệu có thể được đọc từ Buffer.

  • Position - Trỏ đến vị trí hiện tại của con trỏ trong bộ đệm. Ban đầu được đặt là 0 tại thời điểm tạo bộ đệm hay nói cách khác nó là chỉ mục của phần tử tiếp theo sẽ được đọc hoặc ghi sẽ được cập nhật tự động bởi get () và put ( ) các phương pháp.

  • Mark - Đánh dấu đánh dấu vị trí trong bộ đệm. Khi phương thức mark () được gọi là vị trí hiện tại được ghi lại và khi reset () được gọi là vị trí đã đánh dấu được khôi phục.

Loại đệm

Bộ đệm Java NIO có thể được phân loại theo các biến thể sau trên cơ sở các kiểu dữ liệu mà bộ đệm xử lý:

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

Các phương pháp quan trọng của Buffer

Như đã đề cập ở trên, Buffer hoạt động như một đối tượng bộ nhớ, cung cấp tập hợp các phương thức giúp xử lý khối bộ nhớ thuận tiện hơn. Tiếp theo là các phương thức quan trọng của Buffer -

  • allocate(int capacity) - Phương thức này được sử dụng để cấp phát một bộ đệm mới với dung lượng là tham số. Phương thứcllocate ném IllegalArgumentException trong trường hợp dung lượng truyền vào là một số nguyên âm.

  • read() and put() - phương thức đọc của kênh được sử dụng để ghi dữ liệu từ kênh vào bộ đệm trong khi put là phương thức bộ đệm được sử dụng để ghi dữ liệu vào bộ đệm.

  • flip() - Phương thức lật chuyển chế độ của Bộ đệm từ chế độ ghi sang chế độ đọc, nó cũng đặt vị trí trở lại 0 và đặt giới hạn cho vị trí tại thời điểm ghi.

  • write() and get() - Phương thức ghi của kênh được sử dụng để ghi dữ liệu từ bộ đệm sang kênh trong khi get là phương thức của bộ đệm được sử dụng để đọc dữ liệu từ bộ đệm.

  • rewind() - Phương thức tua lại được sử dụng khi cần đọc lại vì nó đặt vị trí trở về 0 và không làm thay đổi giá trị của giới hạn.

  • clear() and compact() - rõ ràng và nhỏ gọn cả hai phương pháp được sử dụng để tạo bộ đệm từ chế độ đọc sang ghi.clear() Phương thức làm cho vị trí bằng 0 và giới hạn bằng với dung lượng, trong phương pháp này, dữ liệu trong bộ đệm không bị xóa chỉ có các điểm đánh dấu được khởi tạo lại.

    Mặt khác compact() phương thức được sử dụng khi vẫn còn một số dữ liệu chưa đọc và chúng tôi vẫn sử dụng chế độ ghi của bộ đệm trong trường hợp này phương thức compact sao chép tất cả dữ liệu chưa đọc vào đầu bộ đệm và đặt vị trí thành ngay sau phần tử chưa đọc cuối cùng. đặt thành công suất.

  • mark() and reset() - Phương pháp đánh dấu như tên gợi ý được sử dụng để đánh dấu bất kỳ vị trí cụ thể nào trong bộ đệm trong khi đặt lại làm cho vị trí trở lại vị trí đã đánh dấu.

Thí dụ

Ví dụ sau đây cho thấy việc triển khai các phương thức đã định nghĩa ở trên.

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

Đầu ra

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