Прямой потоковый метод CopyTo не находит конца - PullRequest
0 голосов
/ 12 декабря 2018

Я читаю SSE, используя этот метод

    Public Shared Sub ReadStreamForever(ByVal stream As Stream)
    Dim encoder = New UTF8Encoding()
    Dim buffer = New Byte(2047) {}
    Dim counter As Integer = 0
    While True
        If stream.CanRead Then
            Dim len As Integer = stream.Read(buffer, 0, 2048)
            counter = counter + 1
            If len > 0 Then
                Dim text = encoder.GetString(buffer, 0, len)
                SSEApplication.Push(text) 'Here I collect the text slices to a List(of string) object
            Else
                Exit While
            End If
        Else
            Exit While
        End If
    End While
    SSEApplication.writer() 'Here I write the content to a .txt file
End Sub

С данными моего примера это занимает около 2 секунд.Я предпочел бы не читать поток в память, хотя и попробовал этот метод

Public Shared Sub ReadStreamForever1(ByVal stream As Stream)

    Dim output As FileStream = File.OpenWrite("C:\Users\mini_dataset.txt")
    While True
        If stream.CanRead Then
            stream.CopyTo(output)
        Else
            Exit While
        End If
    End While
End Sub

Но процесс заканчивается в бесконечном цикле (я полагаю), по крайней мере мне кажется, что конец потока можетне найденЯ могу прервать процесс через несколько секунд, и все данные находятся в файле .txt.Любая идея, что я могу сделать, чтобы заставить работать метод прямого потока в файл?

1 Ответ

0 голосов
/ 12 декабря 2018

Stream.CanRead сообщает, поддерживает ли поток чтение.Поскольку он, по-видимому, читабелен, While True будет продолжаться вечно.
Давайте проверим, вместо этого вывод Stream.CanWrite .

Public Shared Sub ReadStreamForever1(ByVal stream As Stream)
    Using output As FileStream = File.OpenWrite("[Output file path]")
        If output.CanWrite Then
            stream.CopyTo(output)
        End If
    End Using
End Sub

Если процесс занимает некоторое времяи вам нужно сообщить о его прогрессе, вы можете прочитать поток, используя буфер (я не добавлял никакой проверки ошибок, но, конечно, должен использоваться блок try / catch):
(Здесь,с разделением на 100 частей, обычно используемым ProgressBar)

Public Sub ReadStreamForever1(ByVal stream As Stream)
    Dim BufferLength As Integer = 81920 'As the default stream buffer
    Dim Buffer(BufferLength) As Byte
    Dim BytesRead As Long = 0L

    Using output As FileStream = File.OpenWrite("[Output file path]")
        If output.CanWrite Then
            Dim Part As Long = stream.Length \ 100
            Dim PartCount As Integer = 0
            Dim read As Integer = 0
            Do
                read = stream.Read(Buffer, 0, BufferLength)
                If read = 0 Then Exit Do
                If (BytesRead / Part > PartCount) Then
                    PartCount += 1
                    'ReportWriteProgress(PartCount)
                End If
                output.Write(Buffer, 0, read)
                BytesRead += read
            Loop
        End If
    End Using
End Sub
...