Как Поток. CopyTo (Поток) метод, реализованный в.NET 4?

Полезным удобством, представленным в.NET 4, является Поток. CopyTo (Поток [Int32]), который читает содержание из текущего потока и пишет это в другой поток.

Это устраняет потребность в немного утомительном коде, таком как это:

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read (buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write (buffer, 0, read);
    }
}

Так как у меня нет.NET 4 установленными на этой машине, я задавался вопросом, мог ли кто-то, у кого есть.NET 4 установленных, открыть Отражатель и показать нам, как команда Библиотеки классов Платформы реализовала этот метод для.NET 4.

Сравните и контрастируйте их реализацию с фрагментом кода выше. В частности, мне интересно знать, какой размер буфера по умолчанию был выбран.

17
задан Community 23 May 2017 в 11:54
поделиться

1 ответ

В .NET 4.5.1 используется фиксированный размер буфера 81920 байт. (В более ранних версиях .NET использовался фиксированный размер буфера в 4096 байт, и он, несомненно, продолжит изменяться со временем.) Также существует перегрузка, в которой вы можете передать свой собственный размер буфера.

Реализация очень похожа на ваш, по модулю перетасовки и проверки ошибок. Reflector отображает его суть следующим образом:

private void InternalCopyTo(Stream destination, int bufferSize)
{
  int num;
  byte[] buffer = new byte[bufferSize];
  while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
  {
    destination.Write(buffer, 0, num);
  }
}

(Теперь вы можете увидеть фактический источник по адресу http://referencesource.microsoft.com/#mscorlib/system/io/stream.cs#98ac7cf3acb04bb1 . )

Проверка ошибок в основном сводится к тому, являются ли значения input.CanRead и output.CanWrite истинными или любой из них удаляется. Итак, отвечая на вопрос Бенни, это должно быть совершенно счастливое копирование из NetworkStream (или в доступный для записи NetworkStream).

16
ответ дан 30 November 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: