Подтвердить что ты не робот

Как написать содержимое одного потока в другой поток в .net?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Я не уверен, что вы можете напрямую подключить один поток к другому в .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);
}

Ответ 4

BufferedStream.CopyTo(поток)

Ответ 6

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

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