将StreamReader返回到Beginning

Chr*_*ris 64 .net c#

我正在逐行读取文件,我希望能够通过调用方法重新启动读取Rewind().

我怎样才能操纵我的System.IO.StreamReader和/或它的底层System.IO.FileStream来重新阅读文件?

我有一个聪明的想法,FileStream.Seek(long, SeekOffset)用来移动文件,但它没有影响封闭System.IO.StreamReader.我可以Close()重新分配流和读者参考,但我希望有更好的方法.

Amy*_*Amy 111

你需要在流上寻找,就像你一样,然后打电话DiscardBufferedDataStreamReader.文档在这里:

编辑:添加代码示例:

Stream s = new MemoryStream();
StreamReader sr = new StreamReader(s);
// later... after we read stuff
s.Position = 0;
sr.DiscardBufferedData();        // reader now reading from position 0
Run Code Online (Sandbox Code Playgroud)

  • 对任何非简单ANSI文本文件(或者任何具有编码前同步码的文件)执行此操作时要小心.有关详细信息,请参阅下面的答案. (5认同)

小智 36

我用这个方法:

System.IO.StreamReader reader = new System.IO.StreamReader("file.txt")
//end of reading
reader.DiscardBufferedData();
reader.BaseStream.Seek(0, System.IO.SeekOrigin.Begin); 
Run Code Online (Sandbox Code Playgroud)


Eam*_*mon 19

Amy的答案将适用于某些文件,但根据底层流的编码,您可能会得到意想不到的结果.

例如,如果流是UTF-8并且具有前导码,则StreamReader将使用它来检测编码,然后关闭一些内部标志,告诉它检测编码并检查前导码.如果您将流的位置重置为开头,则流阅读器现在将再次使用前导码,但第二次将其包含在输出中.没有公共方法可以重置此编码和前导码状态,因此,如果您需要"回放"流式读取器,最安全的做法是如图所示查找基础流到开头(或设置位置)并创建新的StreamReader,只是在StreamReader上调用DiscardBufferedData()是不够的.


The*_*yan 17

如果BaseStreamcan实际上可以将Positionproperty 设置为0,那么这一切都很好.

如果你不能(例如将是一个HttpWebResponse流),那么一个好的选择是将流复制到MemoryStream...在那里你可以设置Position为0并重新启动Stream你想要的.

  • 如何将流复制到内存流? (2认同)