Pergunta

Qual é a maneira mais eficiente para ler um fluxo em um outro stream? Neste caso, eu estou tentando ler dados em um Filestream em um fluxo genérico. Eu sei que eu poderia fazer o seguinte:
1. linha de leitura por linha e escrever os dados para o fluxo de
2. ler blocos de bytes e escrever para o fluxo
3. etc

Eu só estou tentando encontrar a forma mais eficiente.

Graças

Foi útil?

Solução

Stephen Toub discute um gasoduto fluxo em seu MSDN importa coluna aqui . No artigo, ele descreve um método CopyStream () que as cópias de um fluxo de entrada para outro fluxo. Isso soa bastante semelhantes ao que você está tentando fazer.

Outras dicas

Eu enrola um método de extensão rápida (assim VS 2008 w / apenas 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);
      }
   }
}

Pode ser usado assim:

 using (var input = File.OpenRead(@"C:\wrnpc12.txt"))
 using (var output = File.OpenWrite(@"C:\wrnpc12.bak"))
 {
    input.CopyTo(output);
 }

Você também pode trocar a lógica em torno de um pouco e escrever um método CopyFrom() também.

A leitura de um tampão de bytes e, em seguida, escrevê-lo é mais rápido. Métodos como necessidade ReadLine() para olhar para delimitadores de linha, o que leva mais tempo do que apenas preenchendo um buffer.

Eu assumo por stream genérico, você quer dizer qualquer outro tipo de fluxo, como um fluxo de memória, etc.

Se assim for, a forma mais eficiente é ler blocos de bytes e gravá-los para o fluxo de destinatário. O tamanho do bloco pode ser algo como 512 bytes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top