c# - 如何使用 gzipstream 将内存流压缩成内存流?
问题描述
您好,我的问题是,如果可能的话,我需要将 MemoryStream 和 GZipStream 压缩到 MemoryStream 中,然后压缩到该方法作为参数获取的相同 MemoryStream 中。如果这不能实现,我怎么能做到,所以它是最有效的内存。
这是我当前的方法,它给了我System.NotSupportedException: 'Stream does not support reading。用于 compress.CopyTo
public static void GZipCompress(MemoryStream memoryStream)
{
using (GZipStream compress = new GZipStream(memoryStream, CompressionMode.Compress))
{
compress.CopyTo(memoryStream);
}
}
解决方案
您不能将流复制到自身,至少在没有大量工作的情况下不能。只需为压缩数据分配一个新的 MemoryStream 就很简单且相当有效。例如
public MemoryStream GZipCompress(MemoryStream memoryStream)
{
var newStream = new MemoryStream((int)memoryStream.Length / 2); //set to estimate of compression ratio
using (GZipStream compress = new GZipStream(newStream, CompressionMode.Compress))
{
memoryStream.CopyTo(compress);
}
newStream.Position = 0;
return newStream;
}
这是关于如何执行 MemoryStream 的就地压缩的未经测试的想法。
public void GZipCompress(MemoryStream memoryStream)
{
var buf = new byte[1024 * 64];
int writePos = 0;
using (GZipStream compress = new GZipStream(memoryStream, CompressionMode.Compress))
{
while (true)
{
var br = compress.Read(buf, 0, buf.Length);
if (br == 0) //end of stream
{
break;
}
var readPos = memoryStream.Position;
memoryStream.Position = writePos;
memoryStream.Write(buf, 0, br);
writePos += br;
if (memoryStream.Position > readPos)
{
throw new InvalidOperationException("Overlapping writes corrupted the stream");
}
memoryStream.Position = readPos;
}
}
memoryStream.SetLength(writePos);
memoryStream.Position = 0;
}
推荐阅读
- node.js - Windows 10 64 位中的 npm 安装错误 ( npm install -g angular-cli )
- php - 有没有办法将多个输入推送到 laravel 中的同一个 Db 列?
- c# - 将日志输出重定向到 net core 控制台窗口
- python - 如何通过 SSL 运行 Flask/Python3.x?
- r - 如何将存储在 AWS Secret Manager 中的密钥传递到 Sagemaker 中的 Docker 容器?
- c - 如何找到既属于孪生素数又属于表亲素数的素数?
- python - 从请求中获取的python字典(json)读取时,Pyspark数据帧损坏记录,编码问题
- python - Pyspark 将数据帧写入 avro 维护键值序列
- python - Pytorch Dataloader 没有将数据拆分成批处理
- hibernate - Jpa 查询 postgis 和 h2gis