如何使用GZipStream与System.IO.MemoryStream? [英] How do I use GZipStream with System.IO.MemoryStream?
问题描述
我有一个问题,这个测试功能,我在内存中的字符串采取,COM preSS它,DECOM preSS它。在COM pression的伟大工程,但我似乎无法得到DECOM pression工作。
I am having an issue with this test function where I take an in memory string, compress it, and decompress it. The compression works great, but I can't seem to get the decompression to work.
//Compress
System.IO.MemoryStream outStream = new System.IO.MemoryStream();
GZipStream tinyStream = new GZipStream(outStream, CompressionMode.Compress);
mStream.Position = 0;
mStream.CopyTo(tinyStream);
//Decompress
outStream.Position = 0;
GZipStream bigStream = new GZipStream(outStream, CompressionMode.Decompress);
System.IO.MemoryStream bigStreamOut = new System.IO.MemoryStream();
bigStream.CopyTo(bigStreamOut);
//Results:
//bigStreamOut.Length == 0
//outStream.Position == the end of the stream.
我相信bigStream出至少应该有它的数据,尤其是当我的源流(outStream)正在读取。这是一个MSFT错误还是我的?
I believe that bigStream out should at least have data in it, especially if my source stream (outStream) is being read. is this a MSFT bug or mine?
推荐答案
在你的code会发生什么事是你让开流,但你永远不关闭它们。
What happens in your code is that you keep opening streams, but you never close them.
-
在第2行中,将创建一个
GZipStream
。直到它觉得这是正确的时间这个流不会写任何东西底层流。您可以通过关闭它告诉它。
In line 2, you create a
GZipStream
. This stream will not write anything to the underlying stream until it feels it’s the right time. You can tell it to by closing it.
不过,如果您关闭它,它会关闭底层流( outStream
)了。因此,你不能使用就可以了 mStream.Position = 0
。
However, if you close it, it will close the underlying stream (outStream
) too. Therefore you can’t use mStream.Position = 0
on it.
您应该始终使用使用
,以确保所有的数据流得到休息。下面是适用于你的code的变化。
You should always use using
to ensure that all your streams get closed. Here is a variation on your code that works.
var inputString = "" ... "";
byte[] compressed;
string output;
using (var outStream = new MemoryStream())
{
using (var tinyStream = new GZipStream(outStream, CompressionMode.Compress))
using (var mStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString)))
mStream.CopyTo(tinyStream);
compressed = outStream.ToArray();
}
// "compressed" now contains the compressed string.
// Also, all the streams are closed and the above is a self-contained operation.
using (var inStream = new MemoryStream(compressed))
using (var bigStream = new GZipStream(inStream, CompressionMode.Decompress))
using (var bigStreamOut = new MemoryStream())
{
bigStream.CopyTo(bigStreamOut);
output = Encoding.UTF8.GetString(bigStreamOut.ToArray());
}
// "output" now contains the uncompressed string.
Console.WriteLine(output);
这篇关于如何使用GZipStream与System.IO.MemoryStream?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!