2009-07-30 40 views
5

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

8

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(); 
+2

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)' –

+7

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

+1

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. :-) –

6

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; 
Các vấn đề liên quan