我有一个方法可以通过返回指向打开以供阅读的文件的System.IO.FileStream
来传输文件。此时我想要做的是将流存储到System.IO.MemoryStream
中。
最简单的选择是首先将FileStream读入MemoryStream,然后将MemoryStream返回给调用者。但是这意味着我必须在返回之前将整个文件缓冲到内存中,从而将流响应延迟到调用者。
我想做的事情(如果可能的话)是将FileStream读入MemoryStream并同时将其传递给调用者。这样,文件在返回之前不必缓冲,最终仍然存储到MemoryStream中。
答案 0 :(得分:1)
您可以创建Stream类的自定义实现,在其中将数据红色写入内存流,或使用我的版本,可以在以下位置找到:http://upreader.codeplex.com/SourceControl/changeset/view/d287ca854370#src%2fUpreader.Usenet.Nntp%2fEncodings%2fRecordStream.cs
可以通过以下方式使用:
using (FileStream fileStream = File.Open("test.txt", FileMode.Open))
using (RecordStream recordStream = new RecordStream(fileStream))
{
// make sure we record incoming data
recordStream.Record();
// do something with the data
StreamReader reader = new StreamReader(recordStream);
string copy1 = reader.ReadToEnd();
// now reset
recordStream.Playback();
// do something with the data again
StreamReader reader = new StreamReader(recordStream);
string copy2 = reader.ReadToEnd();
Assert.AreEqual(cop1, copy2);
}
我特别为网络流构建了这个类,但它对fileStream同样有效,它只读取文件一次,而不是在返回之前先缓冲它
一个简单的实现是
class RecordStream : Stream
{
public Stream BaseStream { get; }
public MemoryStream Record { get; }
....
public override int Read(byte[] buffer, int offset, int count)
{
int result = BaseStream.Read(buffer, offset, count);
// store it
Record.Write(buffer, offset, count);
return result;
}
}