Класс GZipStream или DeflateStream?
Документация MSDN сообщает мне следующее:
Класс GZipStream использует gzip формат данных, который включает циклический значение проверки избыточности для обнаружения повреждение данных. Формат данных gzip использует тот же алгоритм сжатия, что и класс DeflateStream.
Кажется, что GZipStream добавляет дополнительные данные к выходу (относительно DeflateStream). Мне интересно, в каком виде сценария было бы важно использовать GZipStream, а не DeflateStream?
Ответы
Ответ 1
Дефлат - это просто алгоритм сжатия. GZip - фактически формат.
Если вы используете GZipStream
для сжатия файла (и сохраните его с расширением .gz
), результат может быть фактически открыт архиваторами, такими как WinZip или инструмент gzip
. Если вы сжимаете с помощью DeflateStream
, эти инструменты не будут распознавать файл.
Если сжатый файл предназначен для открытия этими инструментами, тогда важно использовать GZipStream
вместо DeflateStream
.
Я также считаю важным, если вы переносите большой объем данных по ненадежной среде (т.е. интернет-соединение) и не используете протокол исправления ошибок, такой как TCP/IP. Например, вы можете передавать через последовательный порт, raw-сокет или UDP. В этом случае вам определенно понадобится информация CRC, встроенная в формат GZip, чтобы гарантировать правильность данных.
Ответ 2
GZipStream - это то же самое, что и DeflateStream, но он добавляет некоторый CRC, чтобы гарантировать, что данные не имеют ошибки.
Ответ 3
Ну, я был совершенно не прав в своем первом ответе. Я просмотрел исходный код Mono и обнаружил, что класс GZipStream фактически перенаправляет свои запросы на чтение/запись (и почти любые другие) на соответствующие вызовы методов внутреннего объекта DeflateStream:
public override int Read (byte[] dest, int dest_offset, int count)
{
return deflateStream.Read(dest, dest_offset, count);
}
public override void Write (byte[] src, int src_offset, int count)
{
deflateStream.Write (src, src_offset, count);
}
Единственное отличие состоит в том, что он всегда создает объект DeflateStream с флагом gzip, установленным в true.
Это, конечно, не ответ на ваш вопрос, но, возможно, это поможет немного.
Ответ 4
Дито по Аарону
Обратите внимание на еще одно важное отличие в соответствии с
http://www.webpronews.com/gzip-vs-deflate-compression-and-performance-2006-12:
Я измерил DeflateStream на 41% быстрее, чем GZip.
Я не измерял скорость, но я измерил размер файла как appx. то же самое.
Ответ 5
В то время как GZipStream, по-видимому, использует DeflateStream для декомпрессии, эти два алгоритма не кажутся взаимозаменяемыми. Следующий тестовый код даст вам исключение:
MemoryStream wtt=new MemoryStream();
using (var gs=new GZipStream(wtt,CompressionMode.Compress,true))
{
using (var sw=new StreamWriter(gs,Encoding.ASCII,1024,true))
{
sw.WriteLine("Hello");
}
}
wtt.Position = 0;
using (var ds = new DeflateStream(wtt, CompressionMode.Decompress, true))
{
using (var sr=new StreamReader(ds,Encoding.ASCII,true,1024,true))
{
var txt = sr.ReadLine();
}
}