假设我有以下文件格式(键值对):
Objec1tKey: Object1Value
Object2Key: Object2Value
Object3Key: Object3Value
Object4Key: Object4Value1
Object4Value2
Object4Value3
Object5Key: Object5Value
Object6Key: Object6Value我正在用StreamReader逐行阅读这一行。对于对象1、2、3、5和6,这不是一个问题,因为整个对象都在一行上,所以可以处理对象。
但是对于对象4,我需要处理多行。我可以使用Peek吗?(MSDN用于Peek:返回下一个可用字符,但不使用它.)。有像Peek这样的方法返回下一行而不是字符吗?
如果我可以使用Peek,那么我的问题是,我是否可以使用Peek两次,这样我就可以读取接下来的两行(或3),直到我知道有一个新的对象(obect 5)需要处理为止?
发布于 2014-11-27 10:25:27
我强烈建议您将IO与行处理完全分开。
与其让处理代码使用StreamReader,不如将其传递给IList<string>或IEnumerable<string>.如果您使用IList<string>,那么只需按索引访问行就非常容易了(这样您就可以轻松地跟踪“我正在处理的密钥是从第5行开始的”之类的),但这意味着要么做一些聪明的事情,要么一次读取整个文件。
如果它不是一个大文件,那么仅仅使用File.ReadAllLines将是将文件作为一行列表读取的最简单的方法。
如果它是一个大文件,使用File.ReadLines获得一个IEnumerable<string>,然后您的处理代码需要更聪明一点……例如,它可能希望为它处理的每个键创建一个List<string>,其中包含该键的所有行,并在读取下一个键时让该列表被垃圾收集。
发布于 2014-11-27 10:25:19
现在有了使用Peek的方法,因为它总是只返回流中的"top“字符。它只是读取它,但“不发送”来流它被读取的信息。
在Peek停留在同一位置后,将指针总结为流。
例如,如果您使用FileStream,您可以使用Seek返回,但是您没有精确地说明您使用的是哪种类型的流。
发布于 2014-11-27 10:52:26
你可以这样做:
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);
}
}https://stackoverflow.com/questions/27168164
复制相似问题