假设我们已经给出了一个 API 函数 f(Stream s) 来将包含在流中的二进制数据放入数据库中。我想使用 f 将文件放入数据库,但我想提前压缩数据。因此,我认为我可以执行以下操作:
var fileStream= File.OpenRead(path);
using(var dstream = new DeflateStream(fileStream, CompressionLevel.Optimal))
f(dstream);
但它似乎DeflateStream
只写入流fileStream
,但在压缩时不从中读取。在我发现的所有示例CopyTo
中,流的方法都用于压缩或解压缩。但这意味着我必须在内存中保留一份压缩数据的副本,然后再将其传递f
给例如:
var memoryStream = new MemoryStream();
using(var fileStream= File.OpenRead(path))
using(var dstream = new DeflateStream(memoryStream, CompressionLevel.Optimal)) {
fileStream.CopyTo(dstream);
memoryStream.Seek(0, SeekOrigin.Begin);
f(memoryStream);
}
有什么办法可以避免使用 MemoryStream?
更新 为了一些评论员的持久性,我添加了一个完整的例子:
using System;
using System.IO;
using System.IO.Compression;
public class ThisWouldBeTheDatabaseClient {
public void f(Stream s) {
// some implementation I don't have access to
// The only thing I know is that it reads data from the stream in some way.
var buffer = new byte[10];
s.Read(buffer,0,10);
}
}
public class Program {
public static void Main() {
var dummyDatabaseClient = new ThisWouldBeTheDatabaseClient();
var dataBuffer = new byte[1000];
var fileStream= new MemoryStream( dataBuffer ); // would be "File.OpenRead(path)" in real case
using(var dstream = new DeflateStream(fileStream, CompressionLevel.Optimal))
dummyDatabaseClient.f(dstream);
}
}
虚拟实现中的读取操作f
抛出异常:InvalidOperationException:不支持从压缩流中读取。在评论中结束讨论,我假设所需的行为是不可能的,DeflateStream
但第三方库中有替代方案。