2011-08-25 9 views
7

Estoy intentando redondear una cadena JSON a una matriz de bytes con DeflaterOutputStream, pero el código siguiente arroja java.io.EOFException: Unexpected end of ZLIB input stream.Fin inesperado de la secuencia de entrada ZLIB

Funciona cuando reemplaza la cadena con "Hola mundo", o si elimina algunos caracteres de la cadena a continuación.

¿Alguna idea?

public static void main(String[] args) throws IOException { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    DeflaterOutputStream deflate = new DeflaterOutputStream(bytes, new Deflater(Deflater.BEST_COMPRESSION, true)); 
    OutputStreamWriter writer = new OutputStreamWriter(deflate); 
    writer.write("[1,null,null,\"a\",null,null,null,null,[1,null,null,null,null,null,null,null,null,null,null,null,null,0.0,0.0,null,null]"); 
    writer.flush(); 
    writer.close(); 

    InflaterInputStream inflaterIn = new InflaterInputStream(new ByteArrayInputStream(bytes.toByteArray()), new Inflater(true)); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inflaterIn)); 
    System.out.println(bufferedReader.readLine()); 
} 

versión de Java (OSX):

java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode) 

Respuesta

8

Creo que tiene que ver con la opción de "no-wrap", que estás pasando "verdadero" en tanto el Deflater y Inflater. Establecer ambos en false soluciona el problema, aunque recomiendo establecer la codificación de cadena en ambos lugares (por ejemplo, en UTF-8) en lugar de utilizar la codificación predeterminada del sistema.

Los documentos para "nowrap" son bastante vagos, pero afirman:

Nota: Cuando se utiliza la opción 'nowrap' también es necesario para proporcionar una "falsa" byte adicional como entrada. Esto es requerido por la biblioteca nativa ZLIB para soportar ciertas optimizaciones.

Es de suponer que este byte de entrada ficticia no se encuentra, aunque no explica donde debe ir ...

+0

Eso es todo. Agregando las siguientes soluciones al problema: \t \t bytes.write (0); – slipheed

+0

@slipheed: Me alegra oírlo :) –

12

he tenido este problema y que era porque no estaba correctamente cerrando los flujos de salida.

+6

Tuve un problema similar con 'GZIPOutputStream'. Necesitaba llamar a 'finish()' después de haber terminado de escribir en la transmisión gzip. – abellina

Cuestiones relacionadas