我使用从文本文件中读取数据TextReader
TextReader reader = new StreamReader(stream);
string line;
while ((line = reader.ReadLine()) != null)
{
//.......
}
有时我需要从读者那里偷看下一行(或几行)。
我怎么做?
编辑:更新以允许任意数量的偷看:
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;
}
}
您需要自己执行此操作;但是,这并不难:
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
.
没有可靠的方法在文本阅读器中向后移动阅读位置。您可以尝试寻找底层流,但这可能是不可能的(如果流不支持寻找),或者如果读取器内部发生任何类型的缓存,则可能无法给出您想要的结果。
最可行的方法是记住最后一行,您可以考虑创建自定义类,该类将扩展具有 PeekString 功能的读取器...但是如果您需要使用其他读取器方法重新读取该字符串,则可能很难正确实现.
您可以从文件(ReadAllLines)中读取所有行,然后您可以轻松地对其进行操作。但是看看文件的大小,你可能会使用太多的内存。