【问题标题】:How to use one StreamWriter to write to multiple underlying streams?如何使用一个 StreamWriter 写入多个底层流?
【发布时间】:2017-02-03 16:20:28
【问题描述】:

我正在向System.IO.StreamWriter 写信。

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

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

我正在寻找一种方法来将两个CloudBlobStreams 指定为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);

【问题讨论】:

  • 目前没有Stream这样的标准实现,需要自己制作。

标签: c# azure stream compression gzipstream


【解决方案1】:

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

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);
    }

    ...
}

【讨论】:

  • 谢谢 -- 关于如何处理其他属性的任何想法,例如 LengthPosition,我想它们可能会根据底层流的类型而有所不同?
  • @DavidS。可能显示所有长度中的最小值,并根据每个起始位置有一个相对位置
  • 是的,也许......作为一个私有实现,我想我可以在这两个属性上抛出异常,只要它们不被其他流或我使用
  • @DavidS。我不想在这些属性上抛出异常,因为它们可以由 StreamWriter/Reader 调用。我只会返回“安全”值,例如所有流的最小长度。这将保证该位置永远不会超过流的末尾。不过,跟踪位置会比较棘手。
猜你喜欢
  • 1970-01-01
  • 2010-11-14
  • 2017-08-27
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2021-02-07
  • 2014-06-22
相关资源
最近更新 更多