代码之家  ›  专栏  ›  技术社区  ›  sergiu reznicencu

从StreamReader VB.Net读取两行

  •  2
  • sergiu reznicencu  · 技术社区  · 8 年前

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

    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
    

    输出为:

    [标识]

    一条线路。我在debug mod中检查了流,发现第一次ReadLine调用后的位置是15。所以我必须将“指针”移到第一个VbCrLf之后(一直移到最后)。但我认为这不是正确的做法。我哪里错了?我甚至按值传递流,所以它应该有效。

    编辑
    我做了一些检查,似乎只有当经过一条流时,位置才会移动到末尾。我在同一个Read函数中创建了一个流阅读器,并将其作为参数传递给内存流。它奏效了。我不知道为什么会这样。我还在找一件男装。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Ňɏssa PøngjÇ£rdenlarp    8 年前

    不清楚你真正想做什么,但你不是真的 试图从[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 不会工作,因为 前一个已经消耗了一些数据 。您应该能够将数千行读入一个数组或列表,代码可以将其用作行缓冲区。