2011-08-25 16 views
7

Sto provando a eseguire il round trip di una stringa JSON su un array di byte con DeflaterOutputStream, ma il codice riportato di seguito genera java.io.EOFException: Unexpected end of ZLIB input stream.Fine imprevista del flusso di input ZLIB

Funziona quando si sostituisce la stringa con "Hello world" o se si rimuovono alcuni caratteri dalla stringa seguente.

Qualche 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()); 
} 

versione 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) 

risposta

8

Credo che sia a che fare con l'opzione "no-wrap", che si sta passando "true" per sia nel Deflater e Inflater. Impostando entrambi su false risolve il problema, sebbene raccomando di impostare la codifica delle stringhe in entrambe le posizioni (ad es. In UTF-8) invece di utilizzare la codifica predefinita del sistema.

la documentazione per "nowrap" sono abbastanza vago, ma essi affermano:

Nota: Quando si utilizza l'opzione 'nowrap' è anche necessario fornire un byte extra "fittizio" come input. Questo è richiesto dalla libreria nativa ZLIB per supportare determinate ottimizzazioni.

Presumibilmente questo byte di ingresso manichino manca, anche se non spiega dove dovrebbe andare ...

+0

Questo è tutto. L'aggiunta di quanto segue risolve il problema: \t \t bytes.write (0); – slipheed

+0

@slipheed: Felice di sentirlo :) –

12

Ho avuto questo problema ed è stato perché non stavo chiudendo correttamente i miei flussi in uscita.

+6

Ho avuto questo problema simile a 'GZIPOutputStream'. Avevo bisogno di chiamare 'finish()' dopo aver finito di scrivere sul flusso gzip. – abellina

Problemi correlati