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
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();
¿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;
- 1. Java - Obtenga la salida de sonido de la computadora actual
- 2. Java: cómo cancelar la salida de la aplicación
- 3. Explicación de salida de un programa java
- 4. Formato de salida de Java para cadenas
- 5. Java verbose: gc ¿Cómo leer la salida?
- 6. Códigos de salida y significados de Java
- 7. Diferencia en la salida en Java
- 8. Java Runtime.exec() salida asíncrona
- 9. Calidad de cambio de tamaño de la imagen (Java)
- 10. La antigua generación de Java sigue creciendo, necesita ayuda para interpretar la salida de Java GC
- 11. Java tamaño de imagen, mantener la relación de aspecto
- 12. ¿Cómo aumentar el tamaño de la pila de Java?
- 13. Tubería de entrada y salida en Java
- 14. Programa Primer Certamen de Java salida incorrecta
- 15. Redirigir la salida de ProcessBuilder en Java 5/6?
- 16. ¿Cómo registrar automáticamente la entrada/salida de métodos en Java?
- 17. Arrays de Java: ¿por qué la salida es '1'?
- 18. Problema con la salida de un comando cmd en java
- 19. Java ImageIcon tamaño
- 20. tamaño de tipo de referencia en java
- 21. Generar salida de formato formateado en Java
- 22. Capture xsl: mensaje de salida en java
- 23. Producción de salida LaTeX en Java
- 24. Cadena de salida binaria en Java
- 25. Salida de la consola MATLAB
- 26. Java InputStream tamaño
- 27. ¿Cómo cambiar el tamaño de la imagen original en un tamaño de imagen común en Java?
- 28. ¿Cómo puedo sangrar la salida de salida?
- 29. Intentando comprender el tamaño de la clave Java RSA
- 30. cambiar el tamaño de la imagen java getScaledInstance
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)' –
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
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é. :-) –