我需要单独压缩和解压缩数百万个字符串。第一个循环起作用。第二个不是。基本上我不知道如何使用流。我如何获得重用流的第二种方法?C#重复使用GZipStream进行多个解压缩
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
string s = "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ";
for (int i=0; i<10000; ++i) {
var aCompressed = Zip(Encoding.ASCII.GetBytes(s));
var aDecompressed = UnZip(aCompressed, 0, aCompressed.Length);
string sDbg = System.Text.Encoding.ASCII.GetString(aDecompressed);
Debug.Assert(sDbg == s);
}
// This loop is an utter failure.
var UnZipper = new CUnZip(); // attempt to setup all the unzip framework once
for (int i = 0; i < 10000; ++i) {
var aCompressed = Zip(Encoding.ASCII.GetBytes(s));
var aDecompressed = UnZipper.UnZip(aCompressed, 0, aCompressed.Length);
string sDbg = System.Text.Encoding.ASCII.GetString(aDecompressed);
Debug.Assert(sDbg == s);
}
}
static byte[] Zip(byte[] aIn) {
using (var outStream = new MemoryStream()) {
using (var tinyStream = new GZipStream(outStream, CompressionMode.Compress))
using (var mStream = new MemoryStream(aIn))
mStream.CopyTo(tinyStream);
return outStream.ToArray();
}
}
static byte[] UnZip(byte[] aIn, int i0, int cb) {
using (var inStream = new MemoryStream(aIn, i0, cb))
using (var bigStream = new GZipStream(inStream, CompressionMode.Decompress))
using (var bigStreamOut = new MemoryStream()) {
bigStream.CopyTo(bigStreamOut);
return bigStreamOut.ToArray();
}
}
// this class is an utter failure
class CUnZip {
GZipStream bigStream;
MemoryStream inStream, bigStreamOut;
BinaryWriter argh;
public CUnZip() {
inStream = new MemoryStream();
argh = new BinaryWriter(inStream);
bigStream = new GZipStream(inStream, CompressionMode.Decompress);
bigStreamOut = new MemoryStream();
}
public byte[] UnZip(byte[] aIn, int i0, int cb) {
argh.Write(aIn, i0, cb);
argh.Flush();
bigStream.CopyTo(bigStreamOut);
return bigStreamOut.ToArray();
}
}
}
}
定义不起作用。错误的结果?错误?还有别的吗?但简单地说:你不能只将更多的数据推入解压缩,并假设它会高兴地遵守和做你想做的。你必须创造新的状态。 –
请指出具体细节,而不是假设我们能够猜到,第一个和第二个循环以及由您感知的失败点 –
'bigStream = new GZipStream(inStream,...'为什么您在那里使用'inStream'为了好玩吗? –