Как написать содержимое одного потока в другой поток в .net?
Я часто сталкиваюсь с проблемой, что у меня есть один поток, полный данных, и хочу записать все это в другой поток.
Все примеры кода используют буфер в форме байтового массива.
Есть ли более элегантный способ?
Если нет, то какой идеальный размер буфера. Какие факторы составляют это значение?
Ответы
Ответ 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(поток)
Ответ 5
Чтение данных в FileStream в общий поток
вероятно, есть несколько направлений, чтобы пойти в
Ответ 6
Я не знаю более элегантный способ, чем использовать буфер.
Но размер буфера может иметь значение. Помните о проблемах с копией файлов Vista? Причиной было (в основном) изменение размера буфера. Изменения объясняются в этот blogpost. Вы можете узнать основные факторы этой должности. Однако это относится только к копированию файлов. В приложениях, вероятно, вы делаете много копий памяти, поэтому в этом случае размер 4KB может быть лучшим размером буфера, как рекомендовано в документации .NET.