传递流(不必在中间保存到内存)

Pass-Through Stream (not having to save to memory in the middle)

在我的 C# 程序中,我正在使用一个对象(第三方,所以我无法更改其源代码),该对象在其构造函数 (var myObject = new MyObject(stream);) 中接收流。

我的挑战是,在准备好将文件提供给该对象之前,我需要对文件的某些行进行一些更改。

为此,我编写了以下代码(确实有效):

using (var st = new MemoryStream())
using (var reader = new StreamReader(path))
{
    using (var writer = new StreamWriter(st))
    {
        while (!reader.EndOfStream)
        {
            var currentLine = reader.ReadLine().Replace(@"XXXX", @"YYYY");
            writer.Write(currentLine);
        }
        writer.Flush();
        st.Position = 0;
        var myObject = new MyObject(st);
    }
}

所以,这确实有效,但它看起来效率很低,因为它不再真正流式传输信息,而是在将其传递给对象之前将其全部存储在内存流中。

有没有办法创建一个转换/"pass-through stream"将:

  1. 从 streamreader 读取每一小段
  2. 对那个小数额进行调整
  3. 通过
  4. 流式传输该数量

所以中间不会有大量的内存存储?

谢谢!!

您只需创建自己的 class 派生自 Stream,并实现您的 MyObject 所需的必要方法。

通过在 StreamReader 上调用匹配的 Read/ReadAsync 方法来实现所有 Read/ReadAsync 方法。然后,您可以在数据通过时对其进行修改。

如果修改需要对数据有某种理解,您将需要做一些工作,因为您一次要处理未知数量的字节。您需要将数据缓冲到执行必要转换所需的范围,但是您如何做到这一点对于您要实现的流转换非常具体。

不幸的是,C# Stream class 的设计有很多负担,因此实现 Stream 的整个 API 需要大量工作,但您的 MyObject 很可能只调用Stream 上的一种或两种方法,因此进行一些实验应该很快就会起作用。