- Tạo ứng dụng Spring Boot bằng Spring Launchizr
- Cấu hình Cassandra trong Spring Boot
- Định cấu hình nhóm kết nối Tomcat trên Spring Boot
- Định tuyến tin nhắn Camel đến Artemis được nhúng bằng WildFly
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.
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.
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ể
|
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(); } }
---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
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() } }
3.14159
Thủ tục
Tôi hy vọng Bộ đệm mới(buffer.toString()) luôn bằng nhau theo từng byte. Tuy nhiên, đây không phải là trường hợp đối với tôi. Đầu tiên, đây là trường hợp thực tế: var buf1 = new Buffer(32);
Tôi có Bộ đệm giao thức để ghi dữ liệu. tin nhắn Tin nhắn { bắt buộc double val1 = 1; tùy chọn int val2 =
Xin lưu ý chương trình đơn giản sau đây (dựa trên ví dụ trong wiki dự án protobuf-net v1): sử dụng System.Collections.Generic sử dụng System.Diagnosti;
Trong Bộ đệm giao thức, có cách nào để thư chứa tập hợp các thư lồng nhau không? Ví dụ: người giám sát tin nhắn có thể có một tập hợp nhân viên cùng với tên và bộ phận của người giám sát. Câu trả lời tốt nhất là có. Bạn sử dụng các trường lặp lại;
Tôi muốn biết cách Bộ đệm giao thức xử lý dữ liệu bị hỏng khi phân tích luồng. Có cách nào để biết liệu dữ liệu có bị hỏng hay không. Bộ đệm giao thức có cung cấp bất kỳ cơ chế kiểm tra tính toàn vẹn dữ liệu tích hợp nào không? Cảm ơn bạn, không có câu trả lời tốt nhất
Bộ đệm giao thức xử lý phiên bản loại như thế nào? Ví dụ: khi nào tôi cần thay đổi định nghĩa kiểu theo thời gian? Giống như việc thêm và xóa các trường. Câu trả lời hay nhất Protobuf do Google thiết kế rất khoan dung với việc kiểm soát phiên bản: các yêu cầu dữ liệu không mong muốn
Tôi đã thử đọc tài liệu Protobuf nhưng không thể tưởng tượng được nó được sử dụng cho nhiều trường hợp sử dụng. Tôi muốn biết một số trường hợp sử dụng thực tế để cải thiện hiệu suất của Bộ đệm giao thức. Cảm ơn bạn vì câu trả lời hay nhất. Bộ đệm giao thức là một thư viện tuần tự hóa.
Với một lược đồ Bộ đệm giao thức và một số dữ liệu, việc tuần tự hóa Bộ đệm giao thức có mang tính quyết định giữa các thư viện và ngôn ngữ không? Về cơ bản, bất kể tôi sử dụng thư viện nào, tôi có thể đảm bảo rằng cùng một dữ liệu sẽ luôn giống nhau (theo thứ tự byte)
Tôi đang làm việc trên một chương trình UWP C++/CX mẫu tạo hai luồng giao tiếp mạng UDP sử dụng Windows::Storage::Streams::DataWriter để gửi dữ liệu cho nhau. và Windo
Tôi đang sử dụng đoạn mã sau int lenSend = odl->ByteSize(); char* buf = (char *)malloc(lenSend);
Tài liệu Bộ đệm giao thức cảnh báo... Bạn không bao giờ nên thêm hành vi vào các lớp được tạo bằng cách kế thừa fr
Tôi có một lược đồ nguyên mẫu được xác định như sau, message User { int64 id = 1; bool email_subscribe = 2;
Tôi đang cố gắng hiểu phương pháp mã hóa Bộ đệm giao thức và tôi không thể hiểu cách mã hóa tin nhắn nhúng khi chuyển đổi tin nhắn sang định dạng nhị phân (hoặc thập lục phân). Tôi đoán nó có thể liên quan đến địa chỉ bộ nhớ, nhưng tôi không thể tìm thấy mối quan hệ chính xác. Đây là những gì tôi đã làm. Bước 1
Tôi cần tuần tự hóa và giải tuần tự hóa một loạt thông báo Bộ đệm giao thức đến và đi từ luồng byte. Có một số loại tin nhắn được xác định trước. Cách được khuyến nghị để mã hóa thông tin loại để ứng dụng của tôi có thể biết nên đọc loại nào? Câu trả lời hay nhất phổ biến nhất
Ưu điểm và nhược điểm của Protocol Buffer (protobuf) so với GSON là gì? Trong trường hợp nào protobuf phù hợp hơn GSON? Tôi xin lỗi vì một câu hỏi rất chung chung. Câu trả lời hay nhất json (thông qua
tin nhắn Người { bắt buộc Empid = 1 [mặc định = 100] tên chuỗi bắt buộc = 2 [mặc định = "Raju"]
Tôi đang làm việc trên một thiết bị nhỏ có bộ thông số cấu hình khá lớn (~100 KB) được tạo từ phần mềm PC. Trước đây, chúng ta lưu trữ các tham số trong tệp nhị phân và tải chúng vào cấu trúc dữ liệu. Bảo trì hơi khó chịu (ngôn ngữ khác nhau, đảm bảo cấu trúc
Từ "Các loại chữ ký" trên Mã hóa - Bộ đệm giao thức - Mã Google: Mã hóa ZigZag ánh xạ các số nguyên đã ký thành bỏ dấu
Tôi đang sử dụng Bộ đệm giao thức và mọi thứ đều hoạt động tốt. Ngoài thực tế là tôi không hiểu - tại sao tôi lại cần các thẻ được đánh số trong tệp proto: message SearchRequest { bắt buộc s
Một trong những tính năng hấp dẫn của Bộ đệm giao thức là nó cho phép bạn mở rộng định nghĩa thông báo mà không vi phạm mã sử dụng các định nghĩa cũ hơn. Đối với các bảng liệt kê theo tài liệu: một trường có
Tôi là một lập trình viên xuất sắc, rất giỏi!