了解克隆流的不同方法,以及在哪种情况下使用哪种方法

  • 本文关键字:方法 情况下 了解 .net stream
  • 更新时间 :
  • 英文 :


在复制文件流时,我遇到过两个例子:

,

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

第二个将处理任意二进制数据-它将数据视为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将整个文件作为字节数组读取,尽管如果它是一个大文件,显然会浪费内存。这是第二段代码的一种安全版本。
  • 如果你使用。net 4,你可以使用Stream.CopyTo(Stream)。如果没有,您可以自己编写相同的代码作为扩展方法,以便从其他项目重用。

相关内容

  • 没有找到相关文章