Как оптимизировать мой BinaryWriter?

2

В настоящее время я работаю над программой, которая передает файлы через 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);
        }
    }

Мои проблемы с этим кодом:

  • Он работает очень медленно, есть ли способ оптимизации?
  • То, как я спрашиваю EOF (EndOfFile), кажется очень странным, есть ли еще один вариант элегантности?

Спасибо большое: D

  • 0
    После реализации решения, отправленного Джоном и Гбегеном, я всегда получаю сообщение об ошибке «Запрос не выполнен».
Теги:
ftp

2 ответа

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
    Прежде всего, спасибо Джон. Но теперь я очень запутался: я довольно плохо знаком с работой с потоками, и я думал, что могу писать только с BinaryWriter в двоичном режиме. Таким образом, в Streams также есть методы Read / Write. И еще я кое-что узнал: D Но на случай, если файл имеет размер «0», но я тоже хочу передать этот файл. Если это работает для меня?
  • 0
    Это будет хорошо работать, да - первый вызов Read вернет 0, и вы выйдете из цикла. BinaryReader / BinaryWriter - это служебные классы для чтения и записи примитивов и т. Д. По потокам. Сами потоки - это просто двоичные источники и места назначения для данных - другая вещь, обычно обернутая вокруг них, это StreamReader / StreamWriter, которые декодируют / кодируют текст.
Показать ещё 4 комментария
2

Я думаю, что ваши проблемы с производительностью исходят из двух мест. Вы вызываете bReader.BaseStream.Length каждый раз через цикл, и ваш вызов bReader.ReadBytes() каждый раз выделяет новый массив байтов.

Я также не думаю, что BinaryReader и BinaryWriter необходимы, поскольку вы не используете их функции для чтения и записи типов, отличных от байтовых массивов, которые уже поддерживаются в базовых потоках через Stream.Read() и Stream.Write().

Я бы сделал это как:

byte [] buffer = new byte[1024];
int bytesRead;
while ( (bytesRead = srcStream.Read(buffer, 0, buffer.Length)) != 0 )
{
    dstStream.Write(buffer, 0, bytesRead);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню