我目前正在通过FTP传输文件的程序。我发送二进制文件,因为使用ASCII我不能发送特殊字符。
这是我目前的代码:
using(BinaryReader bReader = new BinaryReader(srcStream))
using (BinaryWriter bWriter = new BinaryWriter(destStream))
{
Byte[] readBytes = new Byte[1024];
for(int i = 0; i < bReader.BaseStream.Length; i += 1024)
{
readBytes = bReader.ReadBytes(1024);
bWriter.Write(readBytes);
}
}
我对此代码的问题是:
非常感谢:D
答案 0 :(得分:9)
你为什么要使用BinaryReader和BinaryWriter?你为什么一再要求长度?这是我现在发布了很多次的方法:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8192];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
使用8K缓冲区,但你可以明显改变它。哦,它重用缓冲区,而不是每次都创建一个新的字节数组,这是你的代码将要做的:)(你不需要分配字节数组开始 - 你可以声明readBytes
在致电bReader.ReadBytes
时。)
答案 1 :(得分:2)
我认为您的表现问题来自两个地方。您每次循环调用bReader.BaseStream.Length
,并且每次调用bReader.ReadBytes()
都会分配一个新的字节数组。
我也不认为BinaryReader和BinaryWriter是必要的,因为您没有使用它们的功能来读取和写入除字节数组以外的类型,这些类型已经通过Stream.Read()
和{{在基础流中得到支持1}}。
我会这样做:
Stream.Write()