我在从流读取器读取两行时遇到问题。我想阅读第一行,然后继续阅读下一行。这是我的代码:
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]
一行。我在 Debug模式中检查了流,发现第一次 ReadLine 调用后该位置为 15。所以我必须将“指针”移动到第一个 VbCrLf 之后(一直到最后)。但我认为这不是正确的做法。我哪里错了?我什至按值传递了流,所以它应该可以工作。
编辑
我做了一些检查,似乎只有在通过流时,位置才会移动到末尾。我在同一个 Read 函数中创建了一个流读取器,并将内存流作为参数传递。有效。我不知道为什么会发生这种情况。我仍在寻找答案。
最佳答案
目前尚不清楚您真正想要做什么,但您并不是真的尝试从 [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
变量上,您就会明白原因:
Streamreader
有一个缓冲区,默认为 1024 字节。您可以将该缓冲区与代码中创建的缓冲区进行比较,发现它们是相同的。还有一个 StreamReader 重载,允许您指定大小:
Public Sub New(stream As System.IO.Stream,
encoding As System.Text.Encoding,
detectEncodingFromByteOrderMarks As Boolean,
bufferSize As Integer)
尝试使用不同的(新)StreamReaders
读取单个数据流是行不通的,因为前一个数据流已经消耗了一些数据。您应该能够将数千行读入数组或列表中,您的代码可以将其用作行缓冲区。
关于vb.net - 从 StreamReader VB.Net 读取两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37367929/