Понимание различных методов клонирования потока и того, какую ситуацию использовать в - PullRequest
0 голосов
/ 29 сентября 2011

При копировании файлового потока я натолкнулся на два примера:

Этот,

Using requestStream as IO.Stream = state.Request.EndGetRequestStream(ar)
    ' Copy the file contents to the request stream.
    Const bufferLength As Integer = 2048
    Dim buffer(bufferLength - 1) As Byte
    Dim count As Integer = 0
    Dim readBytes As Integer = 0
    Using stream As IO.FileStream = IO.File.OpenRead(state.FileName)
        While readBytes <> 0
            readBytes = stream.Read(buffer, 0, bufferLength)
            requestStream.Write(buffer, 0, readBytes)
            count += readBytes
        End While
    End Using
End Using

и вот этот:

    'Copy the contents of the file to the request stream.
    Dim fileContents As Byte()
    Using fileStream As New IO.StreamReader(state.FileName)
        fileContents = Encoding.UTF8.GetBytes(fileStream.ReadToEnd())
    End Using

    Using requestStream As IO.Stream = state.Request.EndGetRequestStream(ar)
        requestStream.Write(fileContents, 0, fileContents.Length)
    End Using

Насколько я понимаю, первый копирует один поток непосредственно в другой, второй копирует через байтовый массив. Оба работают и достигают одного и того же. Я считаю, что первый будет быстрее, но второй выглядит намного проще и проще в обслуживании и т. Д.

Хотя я не вижу, где вы задали кодировку в первом. Зачем вам нужно делать это в одном, а не в другом?

Также были бы полезны объективные комментарии о плюсах и минусах каждого фрагмента. Thx

1 Ответ

2 голосов
/ 29 сентября 2011

Второй будет не работать с произвольными двоичными данными - он обрабатывает данные как текстовые данные в кодировке UTF-8, а затем перекодирует их - это очень плохая идея если вы на самом деле не знаете, что это текст в кодировке UTF-8.

Вторая форма также использует байтовый массив, только один буфер за раз.

Однако у вас есть ошибкав первой версии: вы будете продолжать работать, пока bytesRead не равен нулю, но начинает как 0.

Возможно, вы захотите:

Using stream As IO.FileStream = IO.File.OpenRead(state.FileName)
    readBytes = stream.Read(buffer, 0, bufferLength)
    While readBytes <> 0
        requestStream.Write(buffer, 0, readBytes)
        count += readBytes
        readBytes = stream.Read(buffer, 0, bufferLength)
    End While
End Using

В C # я бы использовал:

int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, bufferLength)) > 0)
{
    requestStream.Write(buffer, 0, readBytes);
    count += readBytes;
}

, но я не знаю, можно ли сделать такое сложное назначение, как это в VB.

Некоторые другие параметры:

  • Вы можете использовать File.ReadAllBytes для чтения всего файла в виде байтового массива, хотя, очевидно, это приведет к потере памяти, если это большой файл.Это своего рода безопасная версия вашего второго кода.
  • Вы можете использовать Stream.CopyTo(Stream), если вы используете .NET 4. Если нет, вы можете написать этот код самостоятельно.в качестве метода расширения для повторного использования из других проектов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...