高级文本阅读器到EndOfFile

本文关键字:EndOfFile 文本 高级 | 更新日期: 2023-09-27 18:03:35

我有一个textReader,在一个特定的实例中,我希望能够快速推进到文件的末尾,以便其他可能持有此对象引用的类将无法调用tr.ReadLine()而不获得null。

这是一个大文件。我不能使用TextReader.ReadToEnd(),因为它经常会导致OutOfMemoryException

我想我会问社区是否有一种方法可以在不使用TextReader.ReadToEnd()的情况下查找流,该方法返回文件中所有数据的字符串。

现行方法,效率低下。
下面的示例代码是一个模拟。显然,我并没有打开一个文件,后面直接跟着一个if语句,问我是否想读到最后。

TextReader tr = new StreamReader("Largefile");
if(needToAdvanceToEndOfFile)
{
    while(tr.ReadLine() != null) { }
}

期望的解决方案(注意此代码块包含假的"概念"方法或由于outofmemoryexception的风险而不能使用的方法)

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,但找不到任何工作。

因为我是新来的,所以我想看看是否有人知道答案。

高级文本阅读器到EndOfFile

如果您读取了任何文件内容,则必须丢弃任何缓冲的数据-由于数据是缓冲的,即使您查找底层流直到最后也可能获得内容-工作示例:

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);

文档中提到的问题是

StreamReader类缓冲来自底层流的输入调用其中一个Read方法。如果你操纵的位置底层流读入数据后进入缓冲区的位置的位置可能与内部流的位置不匹配缓冲区。要重置内部缓冲区,调用DiscardBufferedData方法

使用

reader.BaseStream.Seek(0, SeekOrigin.End);
测试:

using (StreamReader reader = new StreamReader(@"Your Large File"))
{
    reader.BaseStream.Seek(0, SeekOrigin.End);
    int read = reader.Read();//read will be -1 since you are at the end of the stream
}

编辑:用你的代码测试它:

using (TextReader tr = new StreamReader("C:''test.txt"))//test.txt is a file that has data and lines
{
    ((StreamReader)tr).BaseStream.Seek(0, SeekOrigin.End);
    string foo = tr.ReadLine();
    Debug.WriteLine(foo ?? "foo is null");//foo is null
    int read = tr.Read();
    Debug.WriteLine(read);//-1
}