如果压缩一些JSON文本,并使用
上面的代码可以正常运行。下面的输出内存流长度为10,并导致一个空的 .gz 文件。
FileStream
将其写入文件,我会得到预期的结果。然而,我不想写入磁盘。我只想要压缩数据的内存流。
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
子句之外似乎可行。但是,这会关闭大多数用途的输出流。即:
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()
仍然有效?
最终编辑:
只需使用带有leaveOpen
参数的GZipStream
构造函数即可。
bytes.Length == 10
。 - Davebyte[] bytes = output.ToArray();
移到内部的using
块之外,您会得到相同的行为吗? - GalacticCowboy