Как скопировать содержимое одного потока в другой? - PullRequest
499 голосов
/ 23 октября 2008

Как лучше всего скопировать содержимое одного потока в другой? Есть ли для этого стандартный метод утилит?

Ответы [ 12 ]

0 голосов
/ 23 октября 2008

Может быть способ сделать это более эффективно, в зависимости от того, с каким потоком вы работаете. Если вы можете преобразовать один или оба ваших потока в MemoryStream, вы можете использовать метод GetBuffer для работы непосредственно с байтовым массивом, представляющим ваши данные. Это позволяет вам использовать такие методы, как Array.CopyTo, которые абстрагируют все проблемы, поднятые fryguybob. Вы можете просто доверять .NET, чтобы знать оптимальный способ копирования данных.

0 голосов
/ 23 октября 2008

К сожалению, действительно простого решения не существует. Вы можете попробовать что-то вроде этого:

Stream s1, s2;
byte[] buffer = new byte[4096];
int bytesRead = 0;
while (bytesRead = s1.Read(buffer, 0, buffer.Length) > 0) s2.Write(buffer, 0, bytesRead);
s1.Close(); s2.Close();

Но проблема в том, что другая реализация класса Stream может вести себя по-разному, если нечего читать. Поток, считывающий файл с локального жесткого диска, вероятно, будет блокироваться до тех пор, пока операция чтения не прочитает достаточно данных с диска, чтобы заполнить буфер, и вернет меньше данных только в том случае, если достигнет конца файла. С другой стороны, чтение потока из сети может вернуть меньше данных, даже если осталось больше данных для получения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...