Java - размер сжатия output-byteArray - PullRequest
5 голосов
/ 30 июля 2009

При использовании метода deflate java.util.zip.Deflater в качестве аргумента должен быть указан байт []. Насколько большим должен быть инициализирован этот байт []? Я читал, что нет никакой гарантии, что сжатые данные будут даже меньше, чем несжатые данные. Есть определенный процент ввода, с которым я должен идти? В настоящее время я делаю это вдвое больше, чем ввод

Ответы [ 2 ]

8 голосов
/ 30 июля 2009

После вызова deflate, позвоните finished, чтобы узнать, есть ли еще что-то для вывода. например:

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

Если вы просто хотите собрать все байты в памяти, вы можете использовать ByteArrayOutputStream. например:

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();
7 голосов
/ 04 февраля 2013

Почему Java неправильно пишет класс как "deflater"? Слово «дефлятор». Jeez! Извини, пришлось снять это с моей груди.

Как уже отмечалось, ожидаемое использование - продолжать вызывать deflate, пока вы не получите все выходные данные от сжатия. Однако, если вы действительно хотите сделать это за один вызов, тогда существует ограничение на сумму, на которую deflate может расширить данные. В zlib есть функция, которую, к сожалению, Java не делает доступной, которая называется deflateBound(), которая обеспечивает эту верхнюю границу. Вы можете просто использовать консервативную границу этой функции, скопировав соответствующую строку здесь:

complen = sourceLen +
          ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
...