2012-01-18 2 views
2

Мне нужно хранить несовместимые двоичные данные (в основном файлы различных распространенных форматов, JPEG, PDF, MS-Office и некоторые другие нечетные файлы). Медленное сжатие не является проблемой, но я ищу разумную быструю декомпрессию и хороший коэффициент сжатия, который я могу получить.Альтернативы GZIPInput/OutputStream с лучшими коэффициентами сжатия?

На данный момент моя система немедленно сохраняет несжатые данные, и демон пытается сжать данные позже, на данный момент единственной опцией, которую я реализовал, является использование GZIP. Если файл может быть сжат, он прозрачно заменяется сжатой версией демона (вот почему медленное сжатие меня совсем не беспокоит). Если бы было больше вариантов, я был бы счастлив позволить демонам попробовать все варианты и пойти с тем, который дает наилучшее сжатие.

Для того, чтобы система была простой, я не хочу проходить большую часть, чтобы интегрировать материал, который не поддерживает использование Stream API (например, 7-Zip LZMA). Существуют ли какие-либо реализации сжатия рядом с GZIP, предоставленные JRE, которые могут быть полезны? Предпочтение отдается FOS.

+1

Просто FYI, JPEG и PDF уже сжаты как есть, выполнение некоторых дополнительных сжатий gzip на этих типах файлов не будет их значительно сжимать. –

+0

Да, сжатие этих файлов может даже их увеличивать. Хорошая реализация может фильтровать по расширению и оставлять только те сжатые файлы. – Miquel

+0

Да JPEG обычно плохо сжимаются из-за их уже сжатого характера, но я не вижу причин рассматривать их по другому пути кода. Удивительно, что даже GZIP по-прежнему занимает 2-5% от большинства JPEG, по-видимому, из-за того, что в файле есть миниатюра и некоторые несжатые метаданные. PDF-файлы, которые не содержат изображений, обычно сжимаются довольно хорошо (почти как текстовые файлы). – Durandal

ответ

3

Вы можете попробовать giva для bzip lib. bzip обычно имеет лучшие коэффициенты сжатия при скорости. Некоторые реализации ниже:

http://www.kohsuke.org/bzip2//

http://code.google.com/p/jbzip2/

http://www.java2s.com/Code/Java/File-Input-Output/BZip2format.htm

Существует также реализация BZIP на Apache Commons сжимают LIB:

http://commons.apache.org/compress/

+0

После некоторых тестов с реализацией apache (из первой ссылки, но, согласно информации о версии, все реализации apache кажутся одинаковыми/основаны на том же), я могу только сказать, что JRE предоставил GZIP, кажется, победил его в каждом случае (коэффициент сжатия, не измерял скорость). – Durandal

+0

Реализация во второй ссылке представляется независимым портом, но коэффициенты сжатия оказались практически идентичными в моем коротком тесте. – Durandal

+0

В любом виде файла? Большие? – Miquel

1

Вы можете попробовать использование LZMA. Похоже, что кто-то задействовал использование с потоками here.

+0

Вся идея с независимыми процессами и т. Д. На самом деле не вызывает доверия в этом решении. Кроме того, я нашел более «родную» реализацию LZMA. – Durandal