0

假设我有以下文件格式(键值对):

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 行),直到我知道有一个新对象(obect 5)要处理?

4

3 回答 3

1

我强烈建议您将 IO 与线路处理完全分开。

不要让您的处理代码使用 a StreamReader,而是将它传递 an或IList<string>an IEnumerable<string>...IList<string>在第 5 行"或其他),但这意味着要么做一些聪明的事情,要么一口气读完整个文件。

如果它不是一个大文件,那么使用File.ReadAllLines将是读取文件作为行列表的最简单的方法。

如果它一个大文件,请使用File.ReadLines来获取IEnumerable<string>,然后您的处理代码需要更智能一些......例如,它可能希望为List<string>它处理的每个键创建一个,包含该键的所有行 -并在您阅读下一个键时将该列表作为垃圾收集。

于 2014-11-27T10:25:27.030 回答
0

现在有一种方法可以使用Peek多次,因为它总是会在流中只返回“顶部”字符。它只是读取它,但“不发送”以流式传输已读取的信息。

总结Peek停留在同一位置后的流指针。

如果您使用例如FileStream,您可以使用Seek返回,但您没有准确说明您使用的是哪种类型的流。

于 2014-11-27T10:25:19.070 回答
0

你可以这样做:

            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);
                }
            }
于 2014-11-27T10:52:26.407 回答