在复制文件流时,我遇到过两个例子:
,
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)
。如果没有,您可以自己编写相同的代码作为扩展方法,以便从其他项目重用。