Việc sử dụng ByteBuffer trong Java là gì? [đóng cửa]


199

Các ứng dụng ví dụ cho một ByteBuffertrong 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!


1
Tính năng nén của Apache Hadoop (ví dụ như codec zlib) sử dụng ByteBuffer từ jave.nio.
nikk

Tốt để gửi dữ liệu đến GPU.
Pixel

Câu trả lời:


138

Đâ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.


3
Có nơi nào hữu ích trong một trang web lưu lượng truy cập cao được phát triển bằng Java & Cassandra DB không?
Aklin

1
Sau khi tìm kiếm nhanh, có vẻ như có, Cassandra sử dụng ByteBuffer: mail-archive.com/commits@cassandra.apache.org/msg14967.html Nếu bạn đang tự hỏi về một trang web thô, có thể chỉ có sẽ được sử dụng một cách gián tiếp bởi các trang web - bằng cách sử dụng các công cụ như cassandra
kelloti

1
không phải là một liên kết xấu, cảm ơn. Tôi muốn thêm cái này tôi thấy hữu ích - worldmodscode.wordpress.com/2012/12/14/iêu
Peter Perháč

Liên kết xấu tôi sợ ...
RoyalBigMack

96

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đặ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à

  • Các phương thức để nén , sao chépcắt một bộ đệm byte.

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

56
phần lớn bình luận này được sao chép từ các tài liệu java 7 .
Janus Troelsen

6
Trừ khi bạn đang tận dụng một tác dụng phụ không rõ ràng, tôi tin rằng bạn có thể đang sử dụng sai phương pháp để đặt tuyệt đối. Javadoc dường như chỉ ra rằng đặt tuyệt đối yêu cầu một giá trị chỉ mục.
Chuck Wolber

6
ngay cả khi nó chỉ là một bản sao của tài liệu api, nó thậm chí còn gây lo ngại về điểm số của nó, một số người dường như quá lười biếng để xem nó.
Chris

1
Có một sai lầm trong một trong những ví dụ. "Đặt tuyệt đối", bỏ lỡ tham số đầu tiên đại diện cho chỉ mục (0 trong trường hợp này).
bvdb

21

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.

ByteBufferlà 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.

Tài liệu Java của Byte Buffer có thông tin hữu ích.


14

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.


13

Đâ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:

  • Ưu điểm đầu tiên của ByteBuffer bất kể nó là trực tiếp hay gián tiếp là truy cập ngẫu nhiên hiệu quả của dữ liệu nhị phân có cấu trúc (ví dụ, IO cấp thấp như đã nêu trong một trong các câu trả lời). Trước Java 1.4, để đọc dữ liệu đó, người ta có thể sử dụng DataInputStream nhưng không có quyền truy cập ngẫu nhiên.

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:

  1. 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.

  2. 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.

  1. Chia sẻ trang : Các tệp ánh xạ bộ nhớ có thể được chia sẻ giữa các quy trình khi chúng được phân bổ trong không gian bộ nhớ ảo của quy trình và có thể được chia sẻ qua các quy trình.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.