如何优化我的BinaryWriter?

时间:2009-08-13 09:34:19

标签: c# ftp

我目前正在通过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);
        }
    }

我对此代码的问题是:

  1. 它工作得很慢,有优化方法吗?
  2. 我要求EOF(EndOfFile)的方式似乎很奇怪,还有另一种优雅的选择吗?
  3. 非常感谢:D

2 个答案:

答案 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()