Tôi không có ý làm giảm đi câu hỏi của bạn, nhưng có phải là thực sự là một điểm tối ưu hóa tốt trong chương trình của bạn không? Bạn đã xác minh với một hồ sơ mà bạn thực sự có một vấn đề? Câu hỏi của bạn như đã nêu có nghĩa là bạn chưa thực hiện bất kỳ nghiên cứu nào, nhưng chỉ đơn thuần là đoán rằng bạn sẽ có một vấn đề hiệu suất hoặc bộ nhớ bằng cách phân bổ một byte []. Vì tất cả các câu trả lời trong chuỗi này có khả năng là hack của một số loại, bạn nên thực sự xác minh rằng bạn thực sự có một vấn đề trước khi sửa chữa nó.
Quay lại câu hỏi, nếu bạn muốn nén dữ liệu "tại chỗ" trên một ByteBuffer, câu trả lời là không, không có khả năng để làm điều đó được xây dựng trong Java.
Nếu bạn phân bổ đệm của bạn như sau:
byte[] bytes = getMyData();
ByteBuffer buf = ByteBuffer.wrap(bytes);
Bạn có thể lọc byte của bạn [] thông qua một ByteBufferInputStream là câu trả lời trước đề nghị.
Nguồn
2012-01-12 17:00:25
Nén mà không phải trả phí là không thể. Các bộ đệm trực tiếp, theo định nghĩa, _ "một vùng chứa cho một lượng dữ liệu cố định của một kiểu nguyên thủy cụ thể" _. Một sự chuyển đổi như một nén hoặc mã hóa phải được thực hiện bên ngoài bộ đệm. –
tôi hiểu. tôi chỉ muốn thực hiện nén mà không bị thêm hình phạt khi sao chép toàn bộ mảng đệm trực tiếp vào mảng byte java – pdeva
GZIPInputStream không tạo bản sao - nó truyền trực tiếp ra khỏi tệp (dựa trên việc kiểm tra nguồn). Vì vậy, tôi tưởng tượng nó có lẽ nhanh hơn việc tạo bộ đệm trực tiếp của riêng bạn và ánh xạ một tệp cho nó. Nếu bạn thực sự muốn sử dụng một bộ đệm trực tiếp, bạn có thể viết InputStream của riêng bạn mà luồng từ bộ đệm của bạn ... –