2016-05-21 209 views
2

從流讀取器讀取兩行時出現問題。我想讀第一行然後繼續下一行。這裏是我的代碼:從StreamReader讀取兩行VB.Net

Public Function Read() 
    Dim a As New MemoryStream(ASCII.GetBytes("[ID] " & vbCrLf & " salut" & vbCrLf)) 

    Debug.Print(client.ReadLine(a)) 
    Debug.Print(client.ReadLine(a)) 
End Function  


Public Function ReadLine(ByVal Data As MemoryStream) 
    Dim sr As New StreamReader(Data) 
    Return sr.ReadLine 
End Function 

輸出是:

[ID]

一行。我在調試模塊中檢查了流,我發現在第一次ReadLine調用後,位置是15。所以我必須在第一個VbCrLf(這一直到最後)之後移動「指針」。但我認爲這不是正確的做法。我錯在哪裏?我甚至通過價值流,所以它應該已經工作。

          EDIT
     我提出了一些檢查,似乎並通過一個流僅當位置移動到端部。我在同一個Read函數中創建了一個流讀取器,並將其作爲參數傳遞給一個內存流。有效。我不知道爲什麼會發生這種情況。我仍然在尋找一個answear。

回答

2

目前尚不清楚你真正想要做的,但你是不是真的試圖讀取兩條線[A]的StreamReader,你想在同一時間從兩個不同的閱讀一個線使用相同的數據源/緩衝器的流式讀取器

Dim buff = Encoding.ASCII.GetBytes("[ID] " & vbCrLf & " salut" & vbCrLf) 

Using ms As New MemoryStream(buff) 
    Using sr As New StreamReader(ms) 
     Console.WriteLine(sr.ReadLine()) 
     Console.WriteLine("memstream poition: " & ms.Position) 
     Console.WriteLine(sr.ReadLine()) 
     Console.WriteLine("memstream poition: " & ms.Position) 
     Console.WriteLine(sr.ReadLine()) 
    End Using 
End Using 

如果第一sr.ReadLine()設置一個斷點,你會看到MemoryStream位置發生了變化。如果你將鼠標放在sr變量,你就會明白爲什麼:

enter image description here

Streamreader具有緩衝,1024個字節的默認。您可以將該緩衝區與代碼中創建的緩衝區進行比較,看看它們是否相同。還有一個StreamReader過載,它允許你指定的大小:

Public Sub New(stream As System.IO.Stream, 
       encoding As System.Text.Encoding, 
       detectEncodingFromByteOrderMarks As Boolean, 
       bufferSize As Integer) 

嘗試從不同的(新)StreamReaders不會工作,一個單一的數據流中讀取,因以前的人會已經消耗掉一些數據。您應該能夠將數千行讀入數組或列表中,您的代碼可以用作行緩衝區。