[英]Read multiple lines with StreamReader with StreamReader.Peek
假设我有以下文件格式(键值对):
Objec1tKey: Object1Value
Object2Key: Object2Value
Object3Key: Object3Value
Object4Key: Object4Value1
Object4Value2
Object4Value3
Object5Key: Object5Value
Object6Key: Object6Value
我正在用StreamReader
逐行阅读此内容。 对于对象1、2、3、5和6,这不会有问题,因为整个对象都在一行上,因此可以处理该对象。
但是对于对象4,我需要处理多行。 我可以为此使用Peek
吗? ( 用于Peek的MSDN:返回下一个可用字符,但不使用它。 )。 是否有类似Peek
的方法返回下一行而不是字符?
如果可以使用Peek
,那么我的问题是,可以两次使用Peek以便读取下两行(或3行),直到我知道有一个新对象(对象5)要处理?
我强烈建议您将IO与线路处理完全分开。
与其让您的处理代码使用StreamReader
, StreamReader
将其传递给IList<string>
或IEnumerable<string>
...(如果您使用IList<string>
,这将使通过索引访问行确实非常容易(因此,可以轻松地跟踪“我正在处理的密钥是从第5行开始的”或其他内容),但这意味着要么做一些聪明的事情,要么一次性读取整个文件。
如果不是大文件,则仅使用File.ReadAllLines
将是读取文件作为行列表的最简单方法。
如果它是一个大文件,请使用File.ReadLines
获得IEnumerable<string>
,然后您的处理代码需要更聪明……例如,它可能想要为每个要创建的键创建一个List<string>
它进行处理,包含该键的所有行-并在您读取下一个键时将该列表进行垃圾回收。
现在,您可以使用多次使用Peek
方式,因为它总是在流中仅返回“顶部”字符。 它只是读取它,但“不发送”以流式传输已读取的信息。
总结在Peek
停留在同一位置后要指向流的指针。
例如,如果使用FileStream
,则可以使用Seek
进行回溯,但是您并不确定使用的是哪种类型的流。
您可以执行以下操作:
List<MyObject> objects = new List<MyObject>();
using (StreamReader sr = new StreamReader(aPath))
{
MyObject curObj;
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
if (line.IndexOf(':') >= 0) // or whatever identify the beginning of a new object
{
curObj = new MyObject(line);
objects.Add(curObj);
}
else
curObj.AddAttribute(line);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.