我有一个textReader,在特定的实例中,我希望能够快速前进到文件末尾,因此可能包含对此对象的引用的其他类将无法在不获取null的情况下调用tr.ReadLine()。
这是一个大文件。我无法使用TextReader.ReadToEnd(),因为它通常会导致OutOfMemoryException
我以为我会问社区是否有一种方法可以在不使用TextReader.ReadToEnd()的情况下查找流,而该方法会返回文件中所有数据的字符串。
当前方法,效率低下。
以下示例代码是一个模拟。显然,我没有在文件后紧跟一个if语句来打开文件,询问是否要读到最后。
TextReader tr = new StreamReader("Largefile");
if(needToAdvanceToEndOfFile)
{
while(tr.ReadLine() != null) { }
}
所需的解决方案(请注意,此代码块包含伪造的“ concept”方法或由于内存不足异常而无法使用的方法)
TextReader tr = new StreamReader("Largefile");
if(needToAdvanceToEndOfFile)
{
tr.SeekToEnd(); // A method that does not return anything. This method does not exist.
// tr.ReadToEnd() not acceptable as it can lead to OutOfMemoryException error as it is very large file.
}
一种可能的替代方法是使用tr.ReadBlock(args)较大地读取文件。
我在((StreamReader)tr).BaseStream上戳了一下,但是找不到任何有效的方法。
当我刚接触社区时,我想知道是否有人知道答案。
最佳答案
如果已读取任何文件内容,则必须丢弃所有缓冲的数据-由于数据已缓冲,因此即使您寻找底层流,也可能会得到内容-工作示例:
StreamReader sr = new StreamReader(fileName);
string sampleLine = sr.ReadLine();
//discard all buffered data and seek to end
sr.DiscardBufferedData();
sr.BaseStream.Seek(0, SeekOrigin.End);
documentation中提到的问题是
StreamReader类在以下情况下缓冲来自基础流的输入:
您调用Read方法之一。如果您操纵位置
将数据读入缓冲区后,底层流的位置
底层流的数量可能与内部流的位置不匹配
缓冲。要重置内部缓冲区,请调用DiscardBufferedData
方法
关于c# - 高级TextReader到EndOfFile,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6824514/