Считайте данные из FileStream в общий поток.
Вопрос
Какой наиболее эффективный способ прочитать поток в другой поток?В этом случае я пытаюсь прочитать данные из файлового потока в общий поток.Я знаю, что могу сделать следующее:
1.читать построчно и записывать данные в поток
2.читать куски байтов и писать в поток
3.и т. д.
Я просто пытаюсь найти наиболее эффективный способ.
Спасибо
Решение
Стивен Тауб обсуждает потоковый конвейер в своей колонке вопросов MSDN .NET. здесь.В статье он описывает метод CopyStream(), который копирует из одного входного потока в другой поток.Это очень похоже на то, что вы пытаетесь сделать.
Другие советы
Я собрал метод быстрого расширения (только для VS 2008 с версией 3.5):
public static class StreamCopier
{
private const long DefaultStreamChunkSize = 0x1000;
public static void CopyTo(this Stream from, Stream to)
{
if (!from.CanRead || !to.CanWrite)
{
return;
}
var buffer = from.CanSeek
? new byte[from.Length]
: new byte[DefaultStreamChunkSize];
int read;
while ((read = from.Read(buffer, 0, buffer.Length)) > 0)
{
to.Write(buffer, 0, read);
}
}
}
Его можно использовать таким образом:
using (var input = File.OpenRead(@"C:\wrnpc12.txt"))
using (var output = File.OpenWrite(@"C:\wrnpc12.bak"))
{
input.CopyTo(output);
}
Вы также можете слегка поменять логику и написать CopyFrom()
метод тоже.
Чтение буфера байтов и последующая запись происходит быстрее всего.Такие методы, как ReadLine()
нужно искать разделители строк, что занимает больше времени, чем просто заполнение буфера.
Я предполагаю, что под общим потоком вы имеете в виду любой другой тип потока, например поток памяти и т. д.
Если да, то наиболее эффективный способ — прочитать фрагменты байтов и записать их в поток получателя.Размер чанка может составлять около 512 байт.