Qual é a melhor maneira de fazer com que a saída de um flua a entrada para outra
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.
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.