Чтение данных в FileStream в общий поток - PullRequest
5 голосов
/ 24 сентября 2008

Какой самый эффективный способ чтения потока в другой поток? В этом случае я пытаюсь прочитать данные из файлового потока в общий поток. Я знаю, что мог бы сделать следующее:
1. читать построчно и записывать данные в поток
2. прочитать куски байтов и записать в поток
3. и т. Д.

Я просто пытаюсь найти наиболее эффективный способ.

Спасибо

Ответы [ 4 ]

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

Я собрал метод быстрого расширения (поэтому 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().

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

Стивен Туб обсуждает потоковый конвейер в своем MSDN .NET столбце вопросов здесь . В статье он описывает метод CopyStream (), который копирует из одного входного потока в другой поток. Это звучит очень похоже на то, что вы пытаетесь сделать.

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

Чтение буфера байтов, а затем запись его быстрее всего. Методы типа ReadLine() должны искать разделители строк, что занимает больше времени, чем просто заполнение буфера.

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

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

Если это так, самый эффективный способ - это читать куски байтов и записывать их в поток получателей. Размер куска может быть примерно 512 байт.

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