Вы ошибаетесь. TZipFile отлично работает с TStream и остальными TMemoryStream, TFileStream и т.д.
Вот пример:
uses System.Zip;
....
procedure TForm1.Test();
var FZip : TZipFile;
AArchiveStream : TStream;
AFileStreamSource : TStream;
ADecompressionStream, AFileStreamDest : TStream;
ALocalHeader : TZipHeader;
AArchivePath, AFileSourcePath, AFileName : String;
begin
AArchivePath := 'D:\0\005\test.zip';
AFileSourcePath := 'D:\0\005\test.txt';
AFileName := TPath.GetFileName(AFileSourcePath);
// Добавляем в архив
AFileStreamSource := TFileStream.Create('D:\0\005\test.txt', fmOpenRead);
AArchiveStream := TFileStream.Create(AArchivePath, fmCreate);
FZip := TZipFile.Create;
FZip.Open(AArchiveStream, TZipMode.zmWrite);
FZip.Add(AFileStreamSource, AFileName, TZipCompression.zcDeflate);
FZip.Close;
FZip.Free;
AArchiveStream.Free;
// распаковываем из архива
FZip := TZipFile.Create;
AArchiveStream := TFileStream.Create(AArchivePath, fmOpenRead or fmShareDenyNone);
FZip.Open(AArchiveStream, TZipMode.zmRead);
FZip.Read(AFileName, ADecompressionStream, ALocalHeader);
AFileStreamDest := TFileStream.Create('D:\0\005\test_dest.txt', fmCreate);
AFileStreamDest.CopyFrom(ADecompressionStream, ADecompressionStream.Size);
AFileStreamDest.Free;
ADecompressionStream.Free;
FZip.Close;
FZip.Free;
AArchiveStream.Free;
end;
В примере берем файл D:\0\005\test.txt и архивируем его в архив 'D:\0\005\test.zip. Потом достаем из этого архива файл test.txt и сохраняем как D:\0\005\test_dest.txt. Все через потоки. Код написан на коленке, при использовании в реальной задаче вам нужно добавить критические секции и обработчики try finally.
Кстати вы можете использовать и сжатие BZIP2. В данном примере замените TZipCompression.zcDeflate на TZipCompression.zcBZIP2, ну и самое интересное для разработчика - напишите свою реализацию алгоритма архивирования и зарегистрируйте ее с помощью
FZip.RegisterCompressionHandler(TZipCompression.zcBZIP2, .....);
Да, это будет не просто, но опыта наберетесь с лихвой.