TextReader并查看下一行

时间:2012-11-25 05:00:12

标签: c# .net .net-4.0

我使用TextReader

从文本文件中读取数据
TextReader reader = new StreamReader(stream);
string line;
while ((line = reader.ReadLine()) != null)
 {
   //.......
 }

有时我需要从阅读器中查看下一行(或下一行)。

我该怎么做?

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

没有可靠的方法在文本阅读器中向后移动阅读位置。您可以尝试寻找基础流,但可能无法实现(如果流不支持搜索),或者如果在读者内部发生任何类型的缓存,则可能无法提供您想要的结果。

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

答案 3 :(得分:0)

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