我使用TextReader
TextReader reader = new StreamReader(stream);
string line;
while ((line = reader.ReadLine()) != null)
{
//.......
}
有时我需要从阅读器中查看下一行(或下一行)。
我该怎么做?
答案 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),然后您可以轻松地对它们进行操作。但是看看文件的大小,你可以使用太多的内存。