簡體   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