Qual é a melhor maneira de fazer com que a saída de um flua a entrada para outra

StackOverflow https://stackoverflow.com/questions/316007

  •  11-07-2019
  •  | 
  •  

Pergunta

Gostaria de saber se existe uma maneira melhor/embutida, além de usar um buffer de byte e loop, para ler de um fluxo e escrevê -lo para outro (no .NET). Geralmente, isso é feito para aplicar uma transformação a um fluxo e movê -lo.

Nesse caso, o que estou carregando um arquivo, colocando -o através de um fluxo de deflate e escrevendo -o em um arquivo (manuseio de erros removido por simplicidade):

byte[] buffer = new byte[10000000];
using (FileStream fsin = new FileStream(filename, FileMode.Open))
{
    using (FileStream fsout = new FileStream(zipfilename, FileMode.CreateNew))
    {
        using (DeflateStream ds = new DeflateStream(fsout, CompressionMode.Compress))
        {
            int read = 0;
            do
            {
                read = fsin.Read(buffer, 0, buffer.Length);
                ds.Write(buffer, 0, read);
            }
            while (read > 0);
        }
    }
}
buffer = null;

Editar:

.NET 4.0 agora tem um fluxo.

Foi útil?

Solução

Não existe realmente uma maneira melhor do que isso, embora eu tenda a colocar a parte em loop em um CopyTo Método de extensão, por exemplo

public static void CopyTo(this Stream source, Stream destination)
{
    var buffer = new byte[0x1000];
    int bytesInBuffer;
    while ((bytesInBuffer = source.Read(buffer, 0, buffer.Length)) > 0)
    {
        destination.Write(buffer, 0, bytesInBuffer);
    }
}

Que você poderia chamar como:

fsin.CopyTo(ds);

Outras dicas

.NET 4.0 agora tem um Stream.copyTo função

Agora que penso nisso, nunca vi nenhum suporte interno para canalizar os resultados de um fluxo de entrada diretamente para um fluxo de saída enquanto você está descrevendo. Este artigo sobre MSDN Tem algum código para uma classe "StrainPiPeline" que faz o tipo de coisa que você está descrevendo.

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