Các ứng dụng ví dụ cho một ByteBuffer
trong Java là gì? Vui lòng liệt kê bất kỳ kịch bản ví dụ nào được sử dụng. Cảm ơn bạn!
Các ứng dụng ví dụ cho một ByteBuffer
trong Java là gì? Vui lòng liệt kê bất kỳ kịch bản ví dụ nào được sử dụng. Cảm ơn bạn!
Câu trả lời:
Đây là một mô tả tốt về việc sử dụng và thiếu sót của nó. Về cơ bản, bạn sử dụng nó bất cứ khi nào bạn cần thực hiện I / O cấp thấp nhanh. Nếu bạn định triển khai giao thức TCP / IP hoặc nếu bạn đang viết cơ sở dữ liệu (DBMS) thì lớp này sẽ có ích.
Lớp ByteBuffer rất quan trọng vì nó tạo thành cơ sở cho việc sử dụng các kênh trong Java. Lớp ByteBuffer định nghĩa sáu loại hoạt động theo bộ đệm byte, như đã nêu trong tài liệu Java 7 :
Tuyệt đối và tương đối nhận và đặt các phương thức đọc và ghi các byte đơn;
Số lượng lớn tương đối có được các phương thức chuyển các chuỗi byte liền kề từ bộ đệm này thành một mảng;
Hàng loạt tương đối đặt các phương thức chuyển các chuỗi byte liền kề từ một mảng byte hoặc một số bộ đệm byte khác vào bộ đệm này;
Tuyệt đối và tương đối nhận và đặt các phương thức đọc và ghi các giá trị của các kiểu nguyên thủy khác, dịch chúng sang và từ các chuỗi byte theo thứ tự byte cụ thể;
Các phương thức tạo bộ đệm khung nhìn, cho phép bộ đệm byte được xem như một bộ đệm chứa các giá trị của một số kiểu nguyên thủy khác; và
Example code : Putting Bytes into a buffer.
// Create an empty ByteBuffer with a 10 byte capacity
ByteBuffer bbuf = ByteBuffer.allocate(10);
// Get the buffer's capacity
int capacity = bbuf.capacity(); // 10
// Use the absolute put(int, byte).
// This method does not affect the position.
bbuf.put(0, (byte)0xFF); // position=0
// Set the position
bbuf.position(5);
// Use the relative put(byte)
bbuf.put((byte)0xFF);
// Get the new position
int pos = bbuf.position(); // 6
// Get remaining byte count
int rem = bbuf.remaining(); // 4
// Set the limit
bbuf.limit(7); // remaining=1
// This convenience method sets the position to 0
bbuf.rewind(); // remaining=7
Java IO sử dụng API hướng luồng được thực hiện bằng cách sử dụng bộ đệm dưới dạng lưu trữ dữ liệu tạm thời trong không gian người dùng. Dữ liệu đọc từ đĩa của DMA trước tiên được sao chép vào bộ đệm trong không gian kernel, sau đó được chuyển vào bộ đệm trong không gian người dùng. Do đó có phí. Tránh nó có thể đạt được hiệu quả đáng kể trong hiệu suất.
Chúng ta có thể bỏ qua bộ đệm tạm thời này trong không gian người dùng, nếu có cách trực tiếp để truy cập bộ đệm trong không gian kernel. Java NIO cung cấp một cách để làm như vậy.
ByteBuffer
là một trong số các bộ đệm được cung cấp bởi Java NIO. Nó chỉ là một thùng chứa hoặc bể chứa để đọc dữ liệu từ hoặc ghi dữ liệu vào. Hành vi trên đạt được bằng cách phân bổ bộ đệm trực tiếp bằng allocateDirect()
API trên Bộ đệm.
Trong Android, bạn có thể tạo bộ đệm chia sẻ giữa C ++ và Java (với phương thức directAlloc) và thao tác trên cả hai mặt.
Đây là một bài viết tuyệt vời giải thích lợi ích của ByteBuffer. Sau đây là những điểm chính trong bài viết:
Sau đây là những lợi ích đặc biệt cho ByteBuffer / MappedByteBuffer trực tiếp. Lưu ý rằng bộ đệm trực tiếp được tạo bên ngoài heap:
Không bị ảnh hưởng bởi các chu kỳ gc : Bộ đệm trực tiếp sẽ không được di chuyển trong các chu kỳ thu gom rác khi chúng nằm bên ngoài đống. Công nghệ bộ nhớ đệm BigMemory của TerraCota dường như phụ thuộc rất nhiều vào lợi thế này. Nếu họ đang ở trên đống, nó sẽ làm chậm thời gian tạm dừng gc.
Tăng hiệu suất : Trong luồng IO, các cuộc gọi đọc sẽ yêu cầu các cuộc gọi hệ thống, yêu cầu chuyển đổi ngữ cảnh giữa người dùng sang chế độ kernel và ngược lại, sẽ rất tốn kém, đặc biệt là nếu tệp được truy cập liên tục. Tuy nhiên, với ánh xạ bộ nhớ, việc chuyển đổi ngữ cảnh này bị giảm do dữ liệu có nhiều khả năng được tìm thấy trong bộ nhớ (MappedByteBuffer). Nếu dữ liệu có sẵn trong bộ nhớ, nó được truy cập trực tiếp mà không cần gọi HĐH, tức là không chuyển đổi ngữ cảnh.
Lưu ý rằng MappedByteBuffers rất hữu ích đặc biệt nếu các tệp lớn và một vài nhóm khối được truy cập thường xuyên hơn.