В чем разница между GZIPOutputStream и DeflaterOutputStream?

GZIPOutputStream является просто подклассом DeflaterOutputStream, но оба могут быть созданы. Когда я использую один над другим? Является ли сжатие одинаковым?

Ответы

Ответ 1

Различия между DeflaterOutputStream, ZIPOutputStream и GZIPOutputStream отражают разницу между их историческими предшественниками сжатия:

соответственно. Deflate можно рассматривать как ссылочную реализацию алгоритма сжатия, а ZIP и GZIP - это "расширения". Оба последних поддерживают концепцию "архивов", что гораздо более очевидно в Java API для ZipOutputStream.

Если вы просто пытаетесь сжать поток данных, я бы рекомендовал использовать DeflaterOutputStream, но если вы создаете архив, вы, вероятно, должны смотреть на ZipOutputStream.

Ответ 2

DeflaterOutputStream реализует метод сжатия сыпучего дефлята. GZIPOutputStream добавляет дополнительную логику, необходимую для GZIP: проверка CRC-32, магическое число GZIP, заголовок GZIP, трейлер и т.д. См. Источник для GZIPOutputStream.java и DeflaterOutputStream.java.

Ответ 3

Разница заключается в используемом формате сжатия. Из javadoc для DeflaterOutputStream:

public class DeflaterOutputStream
extends FilterOutputStream

This class implements an output stream filter for compressing data in the "deflate" compression format. It is also used as the basis for other types of compression filters, such as GZIPOutputStream.

GZIPOutputStream говорит:

public class GZIPOutputStream
extends DeflaterOutputStream

This class implements a stream filter for writing compressed data in the GZIP file format. 

Поток GZIP расширяет реализацию Deflate с дополнительными подробностями, специфичными для формата файла GZIP.