繁体   English   中英

使用StreamReader.Peek与StreamReader读取多行

[英]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与线路处理完全分开。

与其让您的处理代码使用StreamReaderStreamReader将其传递给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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM