从 StreamReader VB.Net 读取两行

Reading two lines from StreamReader VB.Net

我在从流 reader 中读取两行时遇到问题。我想阅读第一行,然后继续阅读下一行。这是我的代码:

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]

一行。我在调试 mod 中检查了流,我发现在第一次 ReadLine 调用后位置是 15。所以我必须在第一个 VbCrLf 之后移动 "pointer"(一直到最后)。但我认为这不是正确的做法。我哪里错了?我什至按值传递了流,所以它应该有效。

编辑
我做了一些检查,似乎只有在通过流时位置才会移动到最后。我在同一个 Read 函数中创建了一个流 reader 并将其作为参数传递给内存流。有效。我不知道为什么会这样。我还在找答案。

不清楚你真正想做什么,但你并不是真的试图从[a] StreamReader读取两行,你正在尝试读取来自两个不同的流阅读器一次一行行使用相同的数据source/buffer.

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 变量上,您会明白原因:

Streamreader有缓冲区,默认1024字节。您可以将该缓冲区与代码中创建的缓冲区进行比较,看看它们是否相同。还有一个 StreamReader 重载允许您指定大小:

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

尝试从具有不同(新)StreamReaders 的单个数据流中读取是行不通的,因为前一个数据流已经消耗了一些数据。您应该能够将数千行读入一个数组或列表中,您的代码可以将其用作行缓冲区。