【问题标题】:Pass-Through Stream (not having to save to memory in the middle)直通流(不必在中间保存到内存)
【发布时间】:2015-10-16 16:31:34
【问题描述】:

在我的 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. 从流式阅读器中读取每个少量
  2. 对那少量进行调整
  3. 通过流式传输该数量

所以中间不会有很大的内存存储空间吧?

谢谢!!

【问题讨论】:

    标签: c# memory stream streamreader


    【解决方案1】:

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

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

    如果修改需要对数据有某种了解,您将需要做一些工作,因为您一次将处理未知数量的字节。您需要将数据缓冲到进行必要转换所需的程度,但如何做到这一点取决于您想要实现的流的转换。

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

    【讨论】:

    • 谢谢! - 这就是我现在想要做的......我只是希望有一个更好/更简单的方式......:/
    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多