Pregunta

Cuando se utiliza el método deflate de java.util.zip.Deflater, se debe proporcionar un byte [] como argumento, ¿a qué tamaño debe inicializarse ese byte []? 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 con la que debo ir? Actualmente lo hago dos veces más grande que la entrada

¿Fue útil?

Solución

Después de llamar a deflate , llame a terminado para ver si todavía tiene más para mostrar. 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 solo desea recopilar todos los bytes en memoria, puede usar 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();

Otros consejos

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

Como se señaló, el uso esperado es seguir llamando a deflate hasta que obtenga toda la salida 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 desinflar puede expandir los datos. Hay una función en zlib que Java desafortunadamente no pone a disposición llamada deflateBound () que proporciona ese límite superior. Puede usar el límite conservador de esa función, con la línea relevante copiada aquí:

complen = sourceLen +
          ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top