Java - o tamanho de compressão de saída de byteArray
Pergunta
Ao usar a desinflar-método de java.util.zip.Deflater, um byte [] tem de ser fornecido como o argumento, quão grande deve que byte [] ser inicializado para? Eu li não há nenhuma garantia os dados comprimidos vai mesmo ser menor que os dados não comprimidos. Existe uma certa% da entrada que eu deveria ir com? Atualmente eu torná-lo duas vezes maior que a entrada
Solução
Depois de chamar deflate
, chamada finished
para ver se ele ainda tem mais a saída. por exemplo:
byte[] buffer = new byte[BUFFER_SIZE];
while (!deflater.finished()) {
int n = deflater.deflate(buffer);
// deal with the n bytes in out here
}
Se você quiser apenas para coletar todos os bytes na memória que você pode usar um ByteArrayOutputStream. por exemplo:
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();
Outras dicas
Por que o Java escrever mal a classe como "deflater"? A palavra é "deflator". Eita! Desculpe, tive que tirar isso do meu peito.
Como se observa, o uso esperado é manter chamando deflate
até obter toda a produção da compressão. No entanto, se você realmente quiser fazê-lo em uma única chamada, em seguida, há um limite sobre o montante pelo qual deflate pode expandir os dados. Há uma função em zlib que Java, infelizmente, não faz disponível chamado deflateBound()
que prevê que limite superior. Você pode apenas usar o conservador ligado a partir dessa função, com a linha relevante copiado aqui:
complen = sourceLen +
((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;