[英]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與線路處理完全分開。
與其讓您的處理代碼使用StreamReader
, StreamReader
將其傳遞給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.