Khi sử dụng phương pháp deflate của java.util.zip.Deflater, một byte [] phải được cung cấp làm đối số, byte đó [] sẽ được khởi tạo như thế nào? Tôi đã đọc không có bảo đảm dữ liệu nén thậm chí sẽ nhỏ hơn mà các dữ liệu chưa nén. Có một số% đầu vào tôi nên đi cùng không? Hiện tại tôi làm cho nó lớn gấp hai lần đầu vàoJava - kích thước của đầu ra nén-byteArray
Trả lời
Sau khi gọi deflate
, hãy gọi finished
để xem liệu nó có còn nhiều đầu ra không. ví dụ:
byte[] buffer = new byte[BUFFER_SIZE];
while (!deflater.finished()) {
int n = deflater.deflate(buffer);
// deal with the n bytes in out here
}
Nếu bạn chỉ muốn thu thập tất cả byte trong bộ nhớ, bạn có thể sử dụng ByteArrayOutputStream. ví dụ:
byte[] buffer = new byte[BUFFER_SIZE];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while (!deflater.finished()) {
int n = deflater.deflate(buffer);
baos.write(buffer, 0, n);
}
return baos.toByteArray();
Tại sao Java viết sai chính tả lớp là "deflater"? Từ này là "deflator". Jeez! Xin lỗi, phải lấy nó ra khỏi ngực tôi.
Như đã lưu ý, việc sử dụng dự kiến là tiếp tục gọi deflate
cho đến khi bạn nhận được tất cả đầu ra từ quá trình nén. Tuy nhiên, nếu bạn thực sự muốn làm điều đó trong một cuộc gọi, thì có một giới hạn về số tiền mà theo đó giảm phát có thể mở rộng dữ liệu. Có một hàm trong zlib mà Java không may không cung cấp sẵn có tên là deflateBound()
cung cấp giới hạn trên. Bạn chỉ có thể sử dụng thận trọng ràng buộc từ chức năng đó, với dòng tương ứng sao chép ở đây:
complen = sourceLen +
((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
- 1. Các hiệu ứng kích thước ban đầu của Java -Xms
- 2. Tìm ra kích thước tối ưu cho BufferedInputStream trong Java
- 3. Hình ảnh bicubic Java không đầu đổi kích thước
- 4. Java InputStream kích thước
- 5. Kích thước Java ImageIcon
- 6. HTML2PDF không nhận ra kích thước của bảng
- 7. Kích thước của băm MD5 được tạo ra
- 8. Kích thước của MessageBox
- 9. Java ArrayList.remove() không giảm kích thước của ArrayList
- 10. Kích thước bộ nhớ của một ArrayList trong Java
- 11. Java Reflection - Lấy kích thước của đối tượng mảng
- 12. Tính kích thước byte của đối tượng Java
- 13. Kích thước của một byte trong bộ nhớ - Java
- 14. Cách lấy kích thước của khóa RSA trong Java
- 15. Giới hạn kích thước tối đa của HashMap trong Java
- 16. Kích thước của chuỗi
- 17. Kích thước khóa AES trong Java
- 18. Bitmap phần đầu tập tin kích thước
- 19. Lấy kích thước của các kích thước trong mảng
- 20. Lấy kích thước của ZipInputStream
- 21. tăng kích thước heap java vĩnh viễn?
- 22. Kích thước của ViewPager Android
- 23. Làm thế nào để có được đầu ra hoàn chỉnh từ mong đợi khi kích thước bộ đệm trong của kích thước expect_out (buffer) vượt quá?
- 24. Kích thước của Clyther overhead?
- 25. kích thước jframe java swing trả về kích thước lớn hơn như màn hình
- 26. Java có màu và kích thước viền
- 27. Kích thước lô hàng loạt java elasticsearch
- 28. Lấy kích thước màn hình trong Java
- 29. Java Reflection Snippet đầu ra
- 30. Làm thế nào để thay đổi kích thước hình ảnh ban đầu thành một kích thước chung của hình ảnh trong Java?
Và nếu bạn muốn kết thúc với một mảng byte khổng lồ, tạo ra một 'ByteArrayOutputStream' bên ngoài vòng lặp, sau đó nối với nó mỗi lần lặp lại thông qua 'bos.append (out, 0, n)' –
Cảm ơn câu trả lời. Tôi không hoàn toàn hiểu được ... Tôi có phải tiếp tục gọi deflate() nhiều lần cho đến khi toàn bộ đầu vào đã được nén không? Và tôi nên đặt BUFFER_SIZE thành gì? Có hướng dẫn hay điều gì đó tương tự ở đâu đó giải thích điều này không? thanks – Clox
Tôi đoán có một số loại điều kiện chủng tộc, vì đó chính xác là những gì đoạn mã ví dụ thứ hai mà tôi đã đăng. :-) –