2009-07-30 8 views
5

Cuando se utiliza el método de desinflado-java.util.zip.Deflater, un byte [] tiene que ser suministrado como argumento, qué tan grande debe ese byte [] para inicializar? He leído que no hay garantía de que los datos comprimidos sean incluso más pequeños que los datos sin comprimir. ¿Hay un cierto% de la entrada que debo ir? Actualmente lo hago dos veces más grande que la entradaJava - tamaño de salida de la compresión-bytearray

Respuesta

8

Después de llamar al deflate, llame al finished para ver si todavía tiene más para la salida. por ejemplo:

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

Si lo que desea es recoger todos los bytes en memoria que puede utilizar un ByteArrayOutputStream. por ejemplo:

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

Y si se quiere terminar con una matriz de bytes gigante, crear un 'ByteArrayOutputStream' fuera del bucle, tiene que poner a él cada iteración a través de 'bos.append (out, 0, n)' –

+7

Gracias por la respuesta. Aunque aún no lo entiendo ... ¿Debo seguir llamando al desinflado() varias veces hasta que toda la entrada haya sido comprimida? ¿Y a qué debería ajustar el BUFFER_SIZE? ¿Hay algún tutorial o algo así en algún lugar que explique esto? gracias – Clox

+1

Supongo que hubo algún tipo de condición de carrera, porque eso es exactamente lo que hace el segundo fragmento de ejemplo que publiqué. :-) –

6

¿Por qué Java escribe mal la clase como "deflater"? La palabra es "deflactor". ¡Dios! Lo siento, tuve que sacar eso de mi cofre.

Como se ha señalado, el uso esperado es que seguir llamando deflate hasta obtener toda la producción de la compresión. Sin embargo, si realmente desea hacerlo en una sola llamada, entonces hay un límite en la cantidad por la cual el desinflado puede expandir los datos. Hay una función en zlib que desafortunadamente Java no pone a disposición llamada deflateBound() que proporciona ese límite superior. Usted sólo puede usar el conservador se dirigía de esa función, con la línea relevante copiado aquí:

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