在我的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);
}
}
所以,这确实有效,但它看起来效率很低,因为它不再真正地传输信息,而是将它全部存储在内存流中,然后再传递给对象。
有没有办法创建一个转换/“传递流”,它将:
所以中间不会有大量的内存存储?
谢谢!
答案 0 :(得分:1)
您只需创建自己的派生自Stream的类,并实现MyObject所需的必需方法。
通过在StreamReader上调用匹配的Read / ReadAsync方法来实现所有Read / ReadAsync方法。然后,您可以在数据通过时修改数据。
如果修改需要对数据进行某种理解,那么您需要做一些工作,因为您一次只能处理未知数量的字节。您需要将数据缓冲到执行必要转换所需的范围,但是如何执行此操作非常特定于您要实现的流的转换。
不幸的是,C#Stream类的设计加载了大量的包袱,因此实现Stream的整个API是相当多的工作,但很可能你的MyObject只调用Stream上的一两个方法,所以有点实验应该很快就会有效。