2008-09-24 14 views
39

Je rencontre souvent le problème que j'ai un flux plein de données et que je veux tout écrire dans un autre flux.Comment écrire le contenu d'un flux dans un autre flux dans .net?

Tous les exemples de code utilisés ici utilisent un tampon sous la forme d'un tableau d'octets.

Existe-t-il un moyen plus élégant?

Sinon, quelle est la taille idéale du tampon. Quels facteurs composent cette valeur?

Répondre

16

En ce qui concerne la taille du tampon idéal:

« Lorsque vous utilisez la méthode Read, il est plus efficace d'utiliser un tampon qui est la même taille que la mémoire tampon interne du flux, où la mémoire tampon interne est réglé sur votre Si la taille du tampon interne n'était pas spécifiée lors de la construction du flux, sa taille par défaut est de 4 kilo-octets (4096 octets). " Tout processus de lecture de flux utilisera Read (char buffer [], int index, count), qui est la méthode à laquelle se réfère cette citation.

http://msdn.microsoft.com/en-us/library/9kstw824.aspx (sous "Remarques").

7

Je ne sais pas si vous pouvez directement conduit un flux à l'autre dans .NET, mais voici une méthode pour le faire avec un octet intermédiaire tampon. La taille du tampon est arbitraire. La taille la plus efficace dépendra principalement de la quantité de données que vous transférez.

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); 
} 
+1

Vous pouvez implémenter cela comme une méthode d'extension en C# 3.0, et avoir quelque chose comme CopyTo static void (cette entrée Stream, sortie Stream) ... –

2

Je ne suis pas au courant d'une manière plus élégante, que d'utiliser un tampon. Mais la taille d'un tampon peut faire la différence.

Rappelez-vous les problèmes concernant la copie de fichiers de Vista? Sa raison était (fondamentalement) de changer la taille de la mémoire tampon. Les modifications sont expliquées dans this blogpost. Vous pouvez apprendre les principaux facteurs de ce poste. Cependant, ceci ne s'applique qu'à la copie de fichiers. Dans les applications probablement vous faites beaucoup de copies de mémoire, alors dans ce cas, le 4KB pourrait être la meilleure taille de tampon, as recommended by the .NET documentation.

68

Dans .NET 4.0, nous avons finalement obtenu une méthode Stream.CopyTo! Yay!

+4

C'est exactement ce ! –

+2

J'ai décompilé dans la méthode Stream.CopyTo et il fait un appel à "this.InternalCopyTo (destination, 81920);" La valeur entière est la taille de la mémoire tampon. On dirait une taille de buffer folle par rapport au 4k standard que la plupart des techniques de tampons semblent utiliser. Quelqu'un peut-il commenter cela? – ctrlplusb

+2

On dirait que ce numéro essaie juste d'éviter d'utiliser le tas d'objets volumineux, ce qui donnerait un coup de pied légèrement au nord de cette quantité. –

5

BufferedStream.CopyTo (flux)

Questions connexes