Como escrever o conteúdo de um fluxo em um outro fluxo em .net?
Pergunta
Muitas vezes eu correr para o problema que eu tenho um fluxo completo de dados e quer escrever tudo isso em um outro córrego.
Todos os exemplos de códigos aí utilizar um tampão na forma de um byte-matriz.
Existe uma maneira mais elegante para isso?
Se não, qual é o tamanho ideal do buffer. Quais os fatores que compõem esse valor?
Solução
Em relação ao tamanho do buffer ideal:
"Ao usar o método de leitura, é mais eficiente usar um buffer que é do mesmo tamanho que o buffer interno do fluxo, onde o buffer interno é definido para o seu tamanho do bloco desejado, e sempre ler menos do que o bloquear tamanho. Se o tamanho da memória intermédia interna foi especificada quando o fluxo foi construído, o seu tamanho padrão é de 4 kilobytes (4096 bytes) ".
Qualquer processo de leitura de corrente vai usar Leia (char buffer [], int índice, contagem), que é o método desta citação refere-se a.
http://msdn.microsoft.com/en-us/library/ 9kstw824.aspx (em "Observações").
Outras dicas
Em .NET 4.0 finalmente chegamos a método Stream.CopyTo
! Yay!
Eu não tenho certeza se você pode diretamente tubo de um fluxo para outro em .NET, mas aqui está um método para fazê-lo com um buffer de bytes intermediário. O tamanho da memória intermédia é arbitrária. O tamanho mais eficiente dependerá principalmente da quantidade de dados que você está transferindo.
static void CopyStream(Stream input, Stream output){
byte[] buffer = new byte[0x1000];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
output.Write(buffer, 0, read);
}
BufferedStream.CopyTo (Stream)
Ler dados em FileStream em um fluxo genérico
provavelmente terá algumas direções para entrar
Eu não estou ciente de uma maneira mais elegante, do que usar um tampão.
Mas o tamanho de um buffer pode fazer a diferença. Lembre-se das questões sobre a cópia de arquivo do Vista? É da razão era (basicamente) mudando o tamanho da memória intermédia. As mudanças são explicadas em este blogpost. Você pode aprender os principais fatores desse post. No entanto, isto só se aplica para cópia de arquivo. Em aplicações, provavelmente você faz um monte de cópias de memória, por isso, nesse caso, a 4KB poderia ser o melhor tamanho do buffer, como recomendado pela documentação do .NET .