下面是我的C#方法,用于将zlib压缩数据和一些额外数据写入流:
using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress)) {
compressor.Write(input, 0, input.Length);
compressor.Close();
compessStream.Write(extraData, 0, extraData.Length);
}当调用compressor.Close()时,它会自动关闭输入流。因此,我不能向流中写入额外的数据。
如果我在写入额外数据后关闭压缩器,数据的顺序将不再有效。我的额外数据在压缩数据之前写入,而不是像我预期的那样在之后写入。
为什么DeflateStream.Close()还要关闭输入流?除了编写一个封装实际流类并防止后者关闭的流类之外,有什么方法可以绕过它吗?致以问候。
发布于 2016-06-17 16:23:19
DeflateStream在关闭/处理时关闭底层流,因为它是这样设计的:
[__DynamicallyInvokable]
protected override void Dispose(bool disposing)
{
try {
this.PurgeBuffers(disposing);
}
finally {
try {
if (disposing && !this._leaveOpen && this._stream != null) {
this._stream.Close();
}
}
finally {
this._stream = null;
try {
if (this.deflater != null) {
this.deflater.Dispose();
}
}
finally {
this.deflater = null;
base.Dispose(disposing);
}
}
}
}默认情况下,DeflateStream拥有基础流,因此关闭流也会关闭基础流。
您可以通过使用DeflateStream的specific constructor来控制此行为,该can允许您使基础流保持打开状态:
public DeflateStream(
Stream stream,
CompressionMode mode,
bool leaveOpen
)https://stackoverflow.com/questions/37875513
复制相似问题