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

时间:2015-10-16 16:31:34

标签: c# memory stream streamreader

在我的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);
    }
}

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

有没有办法创建一个转换/“传递流”,它将:

  1. 从streamreader中读取每一小笔费用
  2. 对少量进行调整
  3. 通过
  4. 传输该数量

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

    谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

如果修改需要对数据进行某种理解,那么您需要做一些工作,因为您一次只能处理未知数量的字节。您需要将数据缓冲到执行必要转换所需的范围,但是如何执行此操作非常特定于您要实现的流的转换。

不幸的是,C#Stream类的设计加载了大量的包袱,因此实现Stream的整个API是相当多的工作,但很可能你的MyObject只调用Stream上的一两个方法,所以有点实验应该很快就会有效。