Полезным удобством, представленным в.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.
Сравните и контрастируйте их реализацию с фрагментом кода выше. В частности, мне интересно знать, какой размер буфера по умолчанию был выбран.
В .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).