如果壓縮一些json文本,並使用FileStream
將其寫入文件,我會得到預期的結果。但是,我不想寫入磁盤。我只是想要壓縮數據的內存。GZipStream在寫入FileStream時工作,但不是MemoryStream
壓縮到FileStream
:
string json = Resource1.json;
using (MemoryStream input = new MemoryStream(Encoding.UTF8.GetBytes(json)))
using (FileStream output = File.Create(@"C:\Users\roarker\Desktop\output.json.gz"))
{
using (GZipStream compression = new GZipStream(output, CompressionMode.Compress))
{
input.CopyTo(compression);
}
}
上述工作。下面,輸出內存流的長度爲10,並生成一個空的.gz文件。
string json = Resource1.json;
using (MemoryStream input = new MemoryStream(Encoding.UTF8.GetBytes(json)))
using (MemoryStream output = new MemoryStream())
{
using (GZipStream compression = new GZipStream(output, CompressionMode.Compress))
{
input.CopyTo(compression);
byte[] bytes = output.ToArray();
}
}
編輯: 移動output.ToArray()
內using
條款之外似乎工作。但是,這會關閉大多數用法的輸出流。 IE:
using (MemoryStream input = new MemoryStream(Encoding.UTF8.GetBytes(json)))
using (MemoryStream output = new MemoryStream())
{
using (GZipStream compression = new GZipStream(output, CompressionMode.Compress))
{
input.CopyTo(compression);
}
WriteToFile(output);
}
其中:
public static void WriteToFile(Stream stream)
{
using (FileStream output = File.Create(@"C:\Users\roarker\Desktop\output.json.gz"))
{
stream.CopyTo(output);
}
}
因爲流已經關閉,這將在stream.CopyTo失敗。我知道我可以從output.ToArray()
的字節中創建一個新的Stream
,但爲什麼這是必要的?爲什麼ToArray()
在流關閉時工作?
最後編輯:
只需要使用GZipStream
的構造器與leaveOpen
參數。
最後要說清楚,'bytes.Length == 10'。 – Dave
如果您在內部使用塊的外部移動'byte [] bytes = output.ToArray();',你會得到相同的行爲嗎? – GalacticCowboy
溪流像廁所。你沒有完成他們,直到他們被沖洗。除非你是某種令人厭惡的動物。我的意思是,真的。 – Will