Потоки и Сжатие - PullRequest
       4

Потоки и Сжатие

2 голосов
/ 30 сентября 2010

Как что-то вроде System.IO.Compression.GZipStream может работать? Разве что-то вроде GZip не нужно просматривать содержимое всего разархивированного файла, прежде чем он сможет начать писать файл zip?

GZipStream буферизирует все, прежде чем что-то записывает? Если да, то какой смысл реализовывать поток?

Ответы [ 3 ]

4 голосов
/ 30 сентября 2010

Большинство (если не все) распространенных алгоритмов сжатия являются потоковыми алгоритмами, то есть они принимают вводимый поток и выводят его.Обычно они выполняют обработку в блоках определенного размера, иногда называемого размером окна, но все же они выполняют обработку последовательно.Им не нужно ничего знать о полном потоке (ни его полном размере, ни содержимом).

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

2 голосов
/ 30 сентября 2010

Хорошо, позвольте мне ответить на некоторые из них для вас.

Zipping - это способ сжатия набора данных, который делает его очень маленьким и удобным для переноса. проверить: http://forums.pcworld.co.nz/archive/index.php/t-22243.html

Потоков: Потоки - это просто способ абстрагировать последовательность байтов, чтобы вы могли читать из них / записывать в них (и обычно искать их). Чтобы превратить объект в поток или байтовый массив, вы должны использовать BinaryFormatter (или SoapFormatter) вместе с атрибутами Serializiable и NonSerialized, применяемыми к полям сериализуемых объектов. Сериализация объекта просто записывает данные его поля в любой поток по вашему выбору (поскольку System.IO.Stream является базовым классом, вы можете записывать в MemoryStream, FileStream, NetworkStream и т. Д.)

Работа с частями файла также довольно проста. Все, что вам нужно сделать, это использовать метод Seek для потока (или свойство Position) для чтения определенных фрагментов данных. Например:

byte[] buffer = new byte[4000];

myStream.Position = 1000;
myStream.Read(buffer, 0, buffer.Length);

Это будет считывать только байты 1000-5000 в буфер, даже не просматривая остальные данные в файле, который я считаю.

.NET позволяет читать файл, весь файл или ничего из файла. Зная это, GZipStream будет работать аналогично.

Некоторые ссылки для вас:

http://www.geekpedia.com/tutorial190_Zipping-files-using-GZipStream.html

http://www.csharphacker.com/technicalblog/index.php/2009/07/27/gzipstream-helper-gzip/

http://dotnetperls.com/gzipstream

1 голос
/ 30 сентября 2010

Я бы порекомендовал прослушать эпизод # 205 Security сейчас.Они говорят о LZW, а также о потоковом и блочном сжатии, это может помочь ответить на многие ваши вопросы и объяснить, как вы можете сжать файл, не зная всего файла.

...