C# 如何使用一个StreamWriter写入多个底层流?

C# 如何使用一个StreamWriter写入多个底层流?,c#,azure,stream,compression,gzipstream,C#,Azure,Stream,Compression,Gzipstream,我正在向System.IO.StreamWriter写入文本 底层流(在新StreamWriter(underlyngStream)中指定)写入远程文件。(我不认为它的类型是相关的,但为了完整起见,我要提到它是microsoft azureCloudBlobStream underlyingStream) 现在,我想通过编写一个具有相同内容的额外压缩文件来扩展它,但是在StreamWriter和第二个CloudBlobStream之间使用GZipOutputStream compressedUn

我正在向
System.IO.StreamWriter
写入文本

底层流(在新StreamWriter(underlyngStream)中指定)写入远程文件。(我不认为它的类型是相关的,但为了完整起见,我要提到它是microsoft azure
CloudBlobStream underlyingStream

现在,我想通过编写一个具有相同内容的额外压缩文件来扩展它,但是在
StreamWriter
和第二个
CloudBlobStream
之间使用
GZipOutputStream compressedUnderlyingStream

我正在寻找一种方法,将
CloudBlobStream
s都指定为
StreamWriter
的底层流。但我找不到办法。是否存在可以组合两个底层流的流类型?或者我该如何处理这个问题?注意,我希望所有内容都保持为流,以最小化内存中的数据量

//disregard lack of using statements for this example's sake
CloudBlobStream blobStream = blob.OpenWrite();
CloudBlobStream compressedBlobStream = compressedBlob.OpenWrite();
GZipOutputStream compressorStream = new GZipOutputStream(compressedBlobStream);
//I make the streamwriter here for the regular blob,
///but how could I make the same streamwriter also write to the compressedBlob at the same time?
TextWriter streamWriter = new StreamWriter(blobStream, Encoding.UTF8);

我一时想不出一个,但写下你自己的是微不足道的:

class MultiStream : Stream
{
    private List<Stream> streams;

    public Streams(IEnumerable<Stream> streams)
    {
        this.streams = new List<Stream>(streams);
    }

    ...

    public override void Write(byte[] buffer, int offset, int count)
    {
        foreach(Stream stream in streams)
            stream.Write(buffer, offset, count);
    }

    ...
}
类多流:流
{
私有列表流;
公共流(IEnumerable Streams)
{
this.streams=新列表(流);
}
...
公共重写无效写入(字节[]缓冲区、整数偏移量、整数计数)
{
foreach(流中的流)
写入(缓冲区、偏移量、计数);
}
...
}

没有这样的标准
实现,您需要自己制作。谢谢——不过,如果您想知道如何处理其他属性,例如
长度
位置
,我想它们可能会根据底层流的类型而有所不同?@DavidS。可能显示所有长度的最小值,并且根据每个起始位置有一个相对位置是的,可能。。作为一个私有实现,我想我可以在这两个属性上抛出异常,只要它们不被其他流或用户使用me@DavidS. 我不想对这些属性抛出异常,因为StreamWriter/Reader可以调用它们。我只返回“安全”值,比如所有流的最小长度。这将保证该位置永远不会超过流的末端。然而,跟踪职位将更加棘手。以防有人需要实施: