我試圖使用Compression.DeflateStream壓縮和解壓縮流。由於下面的代碼將我的Stream壓縮爲110字節長的數組,因此壓縮似乎正常工作。但是,讀取解壓縮的流會產生一個空字符串。使用Compression.DeflateStream壓縮和解壓縮流
class Program
{
static void Main(string[] args)
{
// Compress a random string value
string value = Path.GetRandomFileName();
byte[] compressedBytes;
using (var writer = new StreamWriter(new MemoryStream()))
{
writer.Write(value);
writer.Flush();
writer.BaseStream.Position = 0;
compressedBytes = Compress(writer.BaseStream);
}
// Decompress compressed bytes
Stream decompressedStream = Decompress(compressedBytes);
// here already applies: decompressedStream.Length == 0
using (var reader = new StreamReader(decompressedStream))
{
string decompressedValue = reader.ReadToEnd();
if (value == decompressedValue)
Console.WriteLine("Success");
else
Console.WriteLine("Failed");
}
}
private static byte[] Compress(Stream input)
{
using (var compressStream = new MemoryStream())
using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
{
input.CopyTo(compressor);
return compressStream.ToArray();
}
}
private static Stream Decompress(byte[] input)
{
var output = new MemoryStream();
using (var compressStream = new MemoryStream(input))
using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress))
decompressor.CopyTo(output);
output.Position = 0;
return output;
}
}
任何人都可以幫助我解決這個問題嗎? 非常感謝。
This works。非常感謝 – greijner
如果您調用'Flush'而不是'Close',則不能使用。我認爲'Close'在內部調用'Flush'就是爲什麼這個工作,但沒有。 –
@Luke:from [DeflateStream.Flush()']的文檔(https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.flush(v = vs.110) .aspx):_「這個方法的當前實現不會刷新內部緩衝區,當對象被丟棄時內部緩衝區被刷新。」至於爲什麼這是設計,'Stream.Flush()'是爲了沖洗內部緩衝,但deflate流只有知道您在_end_時才能最終確定,這隻有在流_closed_時纔有可能。 –