【问题标题】:Read multiple lines with StreamReader with StreamReader.Peek使用 StreamReader 和 StreamReader.Peek 读取多行
【发布时间】:2014-11-27 10:19:56
【问题描述】:

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

Objec1tKey: Object1Value
Object2Key: Object2Value
Object3Key: Object3Value
Object4Key: Object4Value1
Object4Value2
Object4Value3
Object5Key: Object5Value
Object6Key: Object6Value

我正在使用StreamReader 逐行阅读此内容。对于对象1、2、3、5、6来说,这不是问题,因为整个对象在一条线上,所以可以处理对象。

但是对于对象 4,我需要处理多行。我可以为此使用Peek 吗? (MSDN for Peek:返回下一个可用字符但不使用它。)。有没有像Peek 这样返回下一行而不是字符的方法?

如果我可以使用Peek,那么我的问题是,我可以使用 Peek 两次,这样我就可以阅读下两行(或 3 行),直到我知道有一个新对象(对象 5)要处理?

【问题讨论】:

    标签: c# streamreader peek


    【解决方案1】:

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

    不要让您的处理代码使用StreamReader,而是将其传递给IList<string>IEnumerable<string>...如果您使用IList<string>,这将使通过索引访问行变得非常容易(因此您可以轻松跟踪“我正在处理的密钥从第 5 行开始”或其他),但这意味着要么做一些聪明的事情,要么一次性读取整个文件。

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

    如果它一个大文件,使用File.ReadLines来获得IEnumerable<string>,然后你的处理代码需要更聪明一点......例如,它可能想要创建List<string> 为它处理的每个键,包含该键的所有行 - 并让该列表在您读取下一个键时被垃圾收集。

    【讨论】:

    • 这就是我要做的事情。谢谢@Jon Skeet
    • 我注意到我的项目是 .NET Framework 3.5。并且 ReadLines 不存在。框架 3.5 还有其他方法可以做到这一点吗?目前升级框架不是一个好主意
    • @Ozkan:文件大吗?如果没有,您可以编写代码以使用IEnumerable<string> anticipating ReadLines,但暂时只使用ReadAllLines。 (数组仍然是一个序列。)或者您可以使用迭代器块自己实现ReadLines - 这并不难。以stackoverflow.com/questions/1271225/… 为例
    • 是的,文件很大:-)
    【解决方案2】:

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

    总结Peek 保持在同一位置后的流指针。

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

    【讨论】:

      【解决方案3】:

      你可以这样做:

                  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);
                      }
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        相关资源
        最近更新 更多