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

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top