2009-07-30 8 views
5

java.util.zip.Deflater의 deflate 메소드를 사용하는 경우, byte []를 인수로서 지정해야한다. byte []를 어느 정도 초기화 할 필요가 있을까? 압축 된 데이터가 압축되지 않은 데이터보다 작을 것이라는 보장은 없습니다. 내가 입력해야 할 특정 %가 있습니까? 는 현재 내가 여전히 출력에 이상이 있는지 finished 전화, deflate를 호출 한 후 입력압축 출력의 Java 바이트 수 byteArray

답변

8

로 두 배 큰합니다. 예를 들면 : 당신은 그냥 당신이있는 ByteArrayOutputStream를 사용할 수있는 메모리 바이트를 모두 수집 할 경우

byte[] buffer = new byte[BUFFER_SIZE]; 
while (!deflater.finished()) { 
    int n = deflater.deflate(buffer); 
    // deal with the n bytes in out here 
} 

. 예 :

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

그리고 당신은 하나 개의 거대한 바이트 배열로 끝날하려는 경우, 다음에 추가 루프 외부의'ByteArrayOutputStream'을 만들 : 당신은 그냥 여기 복사 관련 라인, 그 함수에서 바인딩 보수적 인을 사용할 수 있습니다 각각의 반복은'bos.append (out, 0, n)' –

+7

으로 해답을 주셔서 감사합니다. 나는 그것을 얻지 못한다 ... 전체 입력이 압축 될 때까지 deflate()를 여러 번 호출해야 하는가? 그리고 BUFFER_SIZE를 어떻게 설정해야합니까? 튜토리얼 또는 이와 유사한 내용이 설명되어 있습니까? 감사합니다. – Clox

+1

저는 경쟁 조건이 있다고 생각합니다. 정확히 제가 게시 한 두 번째 예제 코드 조각이 원인이됩니다. :-) –

6

Java에서 클래스를 "deflater"로 잘못 입력하는 이유는 무엇입니까? 단어는 "deflator"입니다. 이런! 미안, 내 가슴에서 그걸 가져와야 해.

앞서 언급 한대로 압축 결과를 모두 얻을 때까지 deflate을 계속 호출하는 것이 좋습니다. 그러나 이 실제로 인 경우 한 번의 호출로이 작업을 수행하려는 경우 수축이 데이터를 확장 할 수있는 양에 제한이 있습니다. zlib에는 불행히도 Java가 사용 가능하지 않으므로 해당 상한을 제공하는 deflateBound()이라는 함수가 있습니다.

complen = sourceLen + 
      ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;