2016-09-24 104 views
0

我需要单独压缩和解压缩数百万个字符串。第一个循环起作用。第二个不是。基本上我不知道如何使用流。我如何获得重用流的第二种方法?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(); 
      } 
     } 
    } 
} 
+0

定义不起作用。错误的结果?错误?还有别的吗?但简单地说:你不能只将更多的数据推入解压缩,并假设它会高兴地遵守和做你想做的。你必须创造新的状态。 –

+0

请指出具体细节,而不是假设我们能够猜到,第一个和第二个循环以及由您感知的失败点 –

+0

'bigStream = new GZipStream(inStream,...'为什么您在那里使用'inStream'为了好玩吗? –

回答

1

测试你的代码下面将解决此问题:

inStream.Position = 0; 

将其设置在class CUnZipargh.Flush() - UnZip Method

详情:

当你正在重用的MemoryStreamCUnZip课上,其po sition被设置为写入的最后一个字节并执行任何操作,需要读取该字节,则需要将position重置为开始(0),否则它没有任何可读的内容,因此即使stream包含数据,它也无法读取被读取,因为它指向stream的末尾

+0

gzip流可能有一些内部状态无法重置。 – usr

+0

重复使用所有解压缩LOT的速度更快。 – johnnycrash