Как записать содержимое одного потока в другой поток в .net? - PullRequest
39 голосов
/ 24 сентября 2008

Я часто сталкиваюсь с проблемой, что у меня есть один поток данных и я хочу записать все это в другой поток.

Все примеры кода используют буфер в виде байтового массива.

Есть ли более элегантный способ для этого?

Если нет, каков идеальный размер буфера. Какие факторы составляют это значение?

Ответы [ 6 ]

68 голосов
/ 22 октября 2009

В .NET 4.0 мы наконец-то получили метод Stream.CopyTo! Yay!

16 голосов
/ 24 сентября 2008

Относительно идеального размера буфера:

"При использовании метода Read более эффективно использовать буфер того же размера, что и внутренний буфер потока, где для внутреннего буфера задан желаемый размер блока и всегда читать меньше размер блока. Если размер внутреннего буфера не был указан при создании потока, его размер по умолчанию составляет 4 килобайта (4096 байт). "

Любой процесс чтения потока будет использовать Read (символьный буфер [], int index, count), к которому относится эта цитата.

http://msdn.microsoft.com/en-us/library/9kstw824.aspx (в разделе «Замечания»).

7 голосов
/ 24 сентября 2008

Я не уверен, что вы можете напрямую передавать один поток в другой в .NET, но вот способ сделать это с промежуточным байтовым буфером Размер буфера произвольный. Наиболее эффективный размер зависит в основном от объема передаваемых данных.

static void CopyStream(Stream input, Stream output){
    byte[] buffer = new byte[0x1000];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
        output.Write(buffer, 0, read);
}
5 голосов
/ 19 мая 2010

BufferedStream.CopyTo (Stream)

2 голосов
/ 03 октября 2008

Я не знаю более элегантного способа, чем использование буфера.

Но размер буфера может иметь значение. Помните проблемы с копированием файлов в Vista? Это причина (в основном) изменения размера буфера. Изменения описаны в этом блоге . Вы можете узнать основные факторы из этого поста. Однако это относится только к копированию файлов. В приложениях, вероятно, вы делаете много копий памяти, поэтому в этом случае 4 КБ может быть лучшим размером буфера, , как рекомендовано документацией .NET .

2 голосов
/ 24 сентября 2008

Считывание данных в FileStream в общий поток

, вероятно, будет иметь несколько направлений в

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