2016-05-21 15 views
2

Ich habe ein Problem beim Lesen von zwei Zeilen aus einem Stream-Reader. Ich möchte die erste Zeile lesen und dann mit der nächsten fortfahren. Hier ist mein Code:Lesen von zwei Zeilen aus 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 

Die Ausgabe lautet:

[ID]

Eine Zeile. Ich habe den Stream im Debug-Modus überprüft und festgestellt, dass nach dem ersten ReadLine-Aufruf die Position 15 war. Also muss ich den "Zeiger" nach dem ersten VbCrLf bewegen (das ist bis zum Ende). Aber ich denke nicht, dass das der richtige Weg ist. Wo liege ich falsch? Ich habe sogar den Stream nach Wert weitergegeben, also sollte es funktionieren.

          EDIT
      machte ich einige Prüfungen und es scheint, dass und nur dann, wenn die Position bewegt sich zum Ende einen Strom vorbei. Ich habe einen Stream-Reader in der gleichen Read-Funktion erstellt und als Parameter den Memory-Stream übergeben. Es funktionierte. Ich weiß nicht, warum das passiert. Ich suche immer noch eine Answear.

Antwort

2

Es ist nicht klar, was Sie wirklich zu tun versuchen, aber sie sind nicht wirklich versuchen, zwei Linien von [a] Stream zu lesen, versuchen Sie eine Zeile zu einem Zeitpunkt von zwei verschiedenen lesen Streamreader mit der gleichen Datenquelle/Puffer.

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 

Wenn Sie einen Haltepunkt auf dem ersten sr.ReadLine() eingestellt, sehen Sie, dass die MemoryStream Position geändert hat. Wenn Sie die Maus über die sr Variable, werden Sie sehen, warum:

enter image description here

Streamreader einen Puffer hat, 1024 Bytes standardmäßig. Sie können diesen Puffer mit dem im Code erstellten vergleichen und sehen, dass sie identisch sind. Es gibt auch eine StreamReader Überlastung, die die Größe angeben kann:

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

Den Versuch, aus einem einzigen Datenstrom mit unterschiedlichen (neu) StreamReaders nicht funktionieren zu lesen, weil der vorherigen bereits einige der Daten verbraucht haben. Sie sollten in der Lage sein, viele tausend Zeilen in ein Array oder eine Liste zu lesen, die Ihr Code als Zeilenpuffer verwenden kann.