2008-09-24 3 views
39

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

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

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

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

ответ

16

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

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

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

http://msdn.microsoft.com/en-us/library/9kstw824.aspx (Под «примечаниями»).

7

Я не уверен, если вы можете непосредственно труба один поток в другой в .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); 
} 
+1

Вы могли бы реализовать это как метод расширения в C# 3.0, и иметь его как что-то вроде статического ничтожной CopyTo (этот входной поток, выходной поток) ... –

2

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

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

68

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

+4

Это именно он ! –

+2

Я декомпилировался в метод Stream.CopyTo и вызывает вызов this.InternalCopyTo (destination, 81920); " Целочисленное значение является размером буфера. Похоже, сумасшедший размер буфера сравнил стандартный 4k, который, по-видимому, использует большинство методов буферизации. Может кто-нибудь прокомментировать это? – ctrlplusb

+2

Похоже, это число просто пытается избежать использования большой кучи объекта, которая будет ударять чуть севернее этой суммы. –