Domanda

Quando si utilizza il metodo deflate di java.util.zip.Deflater, è necessario fornire un byte [] come argomento, a che dimensione deve essere inizializzato quel byte []? Ho letto che non esiste alcuna garanzia che i dati compressi saranno persino più piccoli dei dati non compressi. C'è un certo% di input con cui dovrei andare? Attualmente lo faccio due volte più grande dell'input

È stato utile?

Soluzione

Dopo aver chiamato deflate , chiama completato per vedere se c'è ancora dell'output. ad esempio:

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

Se vuoi solo raccogliere tutti i byte in memoria puoi usare un ByteArrayOutputStream. ad esempio:

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

Altri suggerimenti

Perché Java scrive erroneamente la classe come "deflater"? La parola è "deflatore". Cribbio! Scusa, ho dovuto togliermelo dal petto.

Come notato, l'uso previsto è quello di continuare a chiamare deflate fino a quando non si ottiene tutto l'output dalla compressione. Tuttavia, se veramente vuoi farlo in una sola chiamata, allora c'è un limite all'importo con cui deflate può espandere i dati. C'è una funzione in zlib che purtroppo Java non rende disponibile chiamato deflateBound () che fornisce quel limite superiore. Puoi semplicemente usare il limite conservativo da quella funzione, con la riga pertinente copiata qui:

complen = sourceLen +
          ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top