4

我使用从文本文件中读取数据TextReader

TextReader reader = new StreamReader(stream);
string line;
while ((line = reader.ReadLine()) != null)
 {
   //.......
 }

有时我需要从读者那里偷看下一行(或几行)。

我怎么做?

4

4 回答 4

6

编辑:更新以允许任意数量的偷看:

public class PeekingStreamReader : StreamReader
{
    private Queue<string> _peeks;

    public PeekingStreamReader(Stream stream) : base(stream)
    {
        _peeks = new Queue<string>();   
    }

    public override string ReadLine()
    {
        if (_peeks.Count > 0)
        {
            var nextLine = _peeks.Dequeue();
            return nextLine;
        }
        return base.ReadLine();
    }

    public string PeekReadLine()
    {
        var nextLine = ReadLine();
        _peeks.Enqueue(nextLine);
        return nextLine;
    }
}
于 2012-11-25T05:10:08.477 回答
3

您需要自己执行此操作;但是,这并不难:

public class PeekTextReader {
    string lastLine;
    private readonly TextReader reader;
    public PeekTextReader(TextReader reader) {
        this.reader = reader;
    }
    public string Peek() {
        return lastLine ?? (lastLine = reader.ReadLine());
    }
    public string ReadLine() {
        string res;
        if (lastLine != null) {
            res = lastLine;
            lastLine = null;
        } else {
            res = reader.ReadLine();
        }
        return res;
    }
}

请注意,偷看一次将使线路保持锁定,直到您完成完整的ReadLine.

于 2012-11-25T05:09:33.117 回答
1

没有可靠的方法在文本阅读器中向后移动阅读位置。您可以尝试寻找底层流,但这可能是不可能的(如果流不支持寻找),或者如果读取器内部发生任何类型的缓存,则可能无法给出您想要的结果。

最可行的方法是记住最后一行,您可以考虑创建自定义类,该类将扩展具有 PeekString 功能的读取器...但是如果您需要使用其他读取器方法重新读取该字符串,则可能很难正确实现.

于 2012-11-25T05:05:20.350 回答
0

您可以从文件(ReadAllLines)中读取所有行,然后您可以轻松地对其进行操作。但是看看文件的大小,你可能会使用太多的内存。

于 2012-11-25T05:27:01.573 回答