cuốn sách gpt4 ai đã làm

Cấu trúc lưu trữ dữ liệu NIO - bộ đệm đệm

In lại Tác giả: Người biết Thời gian cập nhật: 2024-03-13 11:44:03 26 4
mua khóa gpt4 Nike

Bắt mắt một chút

NIO, có thể được gọi là IO mới hoặc IO không chặn, là một API mới được cung cấp sau JDK 1.4. I/O truyền thống đang chặn các hoạt động I/O và hướng luồng; trong khi NIO là các hoạt động I/O không chặn, hướng kênh và hướng bộ đệm. Ngoài ra, NIO còn cung cấp một khái niệm mới về bộ chọn, giúp NIO hiệu quả hơn khi truyền dữ liệu. Hình dưới đây cho thấy mối quan hệ giữa bộ chọn, kênh và bộ đệm.

2 Cấu trúc lưu trữ dữ liệu NIO - bộ đệm Buffer

Lớp đệm dưới cùng là một mảng dùng để lưu trữ dữ liệu. NIO cung cấp 7 loại bộ đệm để lưu trữ các loại dữ liệu khác nhau: ByteBuffer, IntBuffer, ShortBuffer, LongBuffer, FloatBuffer, DoubleBuffer, CharBuffer và chúng đều kế thừa từ java.nio.Buffer.

Có 5 thuộc tính quan trọng trong lớp Buffer.

Vị trí 1 int: Vị trí của phần tử tiếp theo được đọc hoặc ghi.

Giới hạn 2 int: Giới hạn số phần tử có thể được lưu trữ trong Bộ đệm. Nói cách khác, không thể sử dụng giới hạn và các vị trí tiếp theo.

Dung lượng 3 int: Dung lượng tối đa của Buffer và không thể thay đổi sau khi tạo.

4 int mark: Đánh dấu, bạn có thể đặt dấu trong Bộ đệm, sau đó quay lại vị trí của dấu trong danh sách thông qua phương thức reset().

Địa chỉ dài 5: Địa chỉ của bộ nhớ ngoài heap.

Ba phương pháp phổ biến của vùng bộ đệm

Lấy ByteBuffer làm ví dụ minh họa

|
Phương pháp

Giới thiệu
|

Phân bổ ByteBuffer tĩnh công khai(int dung lượng)

Phân bổ bộ đệm gián tiếp có dung lượng kích thước (byte đơn vị)
|
|
ByteBuffer tĩnh công khai phân bổDirect(int dung lượng)

Phân bổ bộ đệm trực tiếp có dung lượng kích thước (byte đơn vị)
|

ByteBuffer trừu tượng công khai put(byte b)

ByteBuffer trừu tượng công khai put(int index, byte b)

ByteBuffer cuối cùng công khai put(byte[] src)

ByteBuffer công khai put(byte[] src, int offset, int length)

Lưu trữ dữ liệu trong bộ đệm
|

byte trừu tượng công khai get()

byte trừu tượng công khai get(int index)

ByteBuffer công khai get(byte[] dst)

ByteBuffer công khai put(byte [] src, int offset, int length)

Đọc dữ liệu từ bộ đệm
|
|
ByteBuffer trừu tượng công khai asReadOnlyBuffer()

Chuyển đổi bộ đệm thành bộ đệm chỉ đọc. Sau đó, Bộ đệm đã chuyển đổi không còn có thể được ghi vào
|
|
ByteBuffer trừu tượng công khai slice()

Cung cấp một phần dữ liệu của Bộ đệm ban đầu từ vị trí đến giới hạn cho một tham chiếu Bộ đệm mới. Nói cách khác, dữ liệu được tham chiếu bởi Bộ đệm được trả về bằng phương thức này là tập hợp con của Bộ đệm ban đầu. Hơn nữa, tham chiếu Bộ đệm mới chia sẻ cùng dữ liệu với tham chiếu Bộ đệm ban đầu.
|
|
Bọc ByteBuffer tĩnh công khai(byte[] array)

Trả về một bộ đệm có nội dung là mảng. Ngoài ra, nếu bạn sửa đổi nội dung của bộ đệm thì mảng cũng sẽ thay đổi và ngược lại.
|

Bộ đệm cuối cùng công khai flip()

Chuyển đổi chế độ ghi sang chế độ đọc
|
|
Tua lại bộ đệm cuối cùng công khai()

Được sử dụng để đọc nhiều lần, vui lòng tham khảo mã nguồn để sao chép cụ thể
|
|
Xóa bộ đệm cuối cùng()

Xóa bộ đệm, vui lòng tham khảo mã nguồn để sao chép cụ thể
|
|
Dấu đệm cuối cùng công khai()

Dấu: mark = vị trí, vui lòng tham khảo mã nguồn để sao chép cụ thể
|
|
công khai thiết lập lại bộ đệm cuối cùng()

Đặt lại: vị trí = dấu, vui lòng tham khảo mã nguồn để sao chép cụ thể
|

Bốn minh chứng cơ bản

1 mã

lớp công khai NIODemo { public static void test1() { Bộ đệm ByteBuffer = ByteBuffer.allocate(100); System.out.println("---allocate----"); buffer.position()); // vị trí: 0 System.out.println("giới hạn: " + buffer.limit()); // giới hạn: 100 System.out.println("capacity (sẽ không thay đổi sau khi định nghĩa): " + buffer.capacity()); // dung lượng (sẽ không thay đổi sau khi định nghĩa): 100 // Lưu trữ dữ liệu trong Hệ thống đệm out.println(" ---put()----"); buffer.put("helloworld".getBytes()); System.out.println("position:" + buffer.position()); / /position:10 System.out.println("limit:" + buffer.limit()); // giới hạn: 100 // Chuyển sang chế độ đọc System.out.println("---flip()----"); .flip(); System.out.println("position:" + buffer.position()); // vị trí: 0 System.out.println("giới hạn:" + buffer.limit()); 10 // Đọc dữ liệu từ Buffer System.out.println("---get()----"); byte[] bs = new byte[buffer.limit()]; // Đọc dữ liệu cũng sẽ di chuyển vị trí lùi System.out.println("Đọc dữ liệu: " + new String(bs)); // Đọc dữ liệu: helloworld System.out.println("position:" + buffer.position()); / vị trí: 10 System.out.println("giới hạn: " + buffer.limit()); // giới hạn: 10 System.out.println("----slice()---"); phân bổ(8); // bộ đệm: 0,1,2,3,4,5,6,7 for (int i = 0; i < buffer.capacity(); i++) { buffer.put((byte) i ); } buffer.position(2); buffer.limit(6); // sliceBuffer: 2, 3, 4, 5; lấy tham chiếu đến bộ đệm từ vị trí đến giới hạn. ByteBuffer sliceBuffer = buffer.slice(); // sliceBuffer chia sẻ dữ liệu giống như Buffer ban đầu, nghĩa là khi dữ liệu trong sliceBuffer được sửa đổi, bộ đệm cũng sẽ thay đổi. for (int i = 0; i < sliceBuffer.capacity(); i++) { byte b = sliceBuffer.get(i); b += 100; sliceBuffer.put(i, b); println("Sau khi sửa đổi sliceBuffer, hãy xem bộ đệm: "); buffer.position(0); (buffer.hasRemaining()) {//{x,x,x,x,x,x} buffer.hasRemaining(): Xác định xem có phần tử nào còn lại không System.out.print(buffer.get() + "," ) ; // 0,1,102,103,104,105,6,7, } System.out.println(); System.out.println("----mark--------"); = ByteBuffer.allocate(100); buffer2.put("abcdefg".getBytes()); // Tại vị trí này, tạo một dấu hiệu buffer2.mark(); location()); // vị trí: 7 System.out.println("mark: " + buffer2.mark().position()); // mark: 7 /* via get(byte[] dst, int offset, int length) để đọc "cde" trong bộ đệm. Lưu ý rằng phương pháp này có thể đọc dữ liệu trực tiếp từ offset vị trí đã chỉ định trong Bộ đệm mà không cần flip() hoặc tua lại(). */ buffer2.get(bs, 2, 3); buffer2.reset(); // Khôi phục vị trí về vị trí 7 System.out.println("position: " + buffer2.position()); .out.println("mark:" + buffer2.mark().position()); // mark:7 // Xác định xem có còn dữ liệu trong bộ đệm hay không if (buffer2.hasRemaining()) { System.out.println("Số khoảng trắng còn lại trong Bộ đệm: " + buffer2.remaining()); // Số khoảng trắng còn lại trong Bộ đệm: 93 } // Đọc lại tua lại(): 1.postion=0, 2. Hủy mark() System.out.println("---rewind()----"); buffer2.rewind();println("position:" + buffer2.position()); // location:0 // clear() "xóa" bộ đệm System.out.println("-------clear()---- ----"); ByteBuffer buffer3 = ByteBuffer.allocate(100); buffer3.put("abc".getBytes()); buffer3.clear(); // "Làm trống" bộ đệm: location=0, nhưng dữ liệu không thực sự bị xóa, nó chỉ ở trạng thái bị loại bỏ System.out.println("position:" + buffer3.position()); // location:0 System. out.println ("giới hạn:" + buffer3.limit()); // limit:100 System.out.println("Sau khi xóa(), dữ liệu trong Bộ đệm vẫn có thể được lấy:" + (char) buffer3. được(1) ); Sau clear(), dữ liệu trong Bộ đệm vẫn có thể được lấy: b } public static void main(String[] args) Throws IOException { test1(); } }

2 kết quả kiểm tra

---phân bổ----

vị trí: 0

giới hạn: 100

dung lượng (sẽ không thay đổi sau khi định nghĩa): 100

---đặt()----

vị trí: 10

giới hạn: 100

---lật()----

vị trí: 0

giới hạn: 10

---lấy()----

Đọc dữ liệu: helloworld

vị trí: 10

giới hạn: 10

----lát cắt()---

Sau khi sửa đổi sliceBuffer, hãy xem bộ đệm:

0,1,102,103,104,105,6,7,

----đánh dấu--------

vị trí: 7

điểm: 7

vị trí: 7

điểm: 7

Số lượng khoảng trống còn lại trong Bộ đệm: 93

---tua lại()----

vị trí: 0

-------thông thoáng()--------

vị trí: 0

giới hạn: 100

Sau clear(), dữ liệu trong Bộ đệm vẫn có thể lấy được: b

5. Bộ đệm lưu trữ nhiều loại dữ liệu

1 mã

gói nio; nhập java.io.FileInputStream; nhập java.io.FileOutputStream; nhập java.io.IOException; nhập java.nio.ByteBuffer; nhập java.nio.MappedByteBuffer; nio.channels.Pipe; nhập java.nio.charset.CharacterCodingException; java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class NIODemo { // Bộ đệm lưu trữ nhiều loại dữ liệu public static void test() ném CharacterCodingException { ByteBuffer buffer = ByteBuffer.allocate(32); putDouble (3.14159); buffer.putChar('Cheng'); buffer.flip(); Thứ tự nhất quán System.out.println(buffer.getDouble()); System.out.println(buffer.getChar()); } public static void main(String[] args) ném IOException { test() } }

2 bài kiểm tra

3.14159

Thủ tục

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress