我有一个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/

10-10 18:28