41 votes

Comment écrire le contenu d'un flux dans un autre flux en .net ?

Je rencontre souvent le problème suivant : j'ai un flux rempli de données et je veux tout écrire dans un autre flux.

Tous les exemples de code existants utilisent un tampon sous la forme d'un tableau d'octets.

Existe-t-il une manière plus élégante de procéder ?

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

71voto

Thomas Danecker Points 3127

Dans .NET 4.0, nous avons enfin obtenu une fonction Stream.CopyTo méthode ! Hourra !

2 votes

J'ai décompilé la méthode Stream.CopyTo et elle fait un appel à "this.InternalCopyTo(destination, 81920) ;" La valeur entière étant la taille du tampon. Cela semble être une taille de tampon folle par rapport à la norme de 4k que la plupart des techniques de mise en mémoire tampon semblent utiliser. Quelqu'un peut-il faire un commentaire à ce sujet ?

2 votes

Il semble que ce chiffre vise simplement à éviter l'utilisation du grand tas d'objets, qui interviendrait légèrement au nord de ce montant.

0 votes

81920 ressemble presque à une faute de frappe mais je soupçonne @JamesWorld d'avoir raison, qu'ils ont choisi une valeur suffisamment petite pour éviter le LOH, mais suffisamment grande pour être efficace pour les longs flux et pas trop mauvaise pour les flux courts. Si vous avez un flux court, vous pouvez simplement utiliser la surcharge de CopyTo() qui accepte une taille de tampon.

16voto

Chris Points 8576

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

" Lorsque vous utilisez la méthode Read, il est plus efficace d'utiliser un tampon de la même taille que le tampon interne du flux, où le tampon interne est défini à la taille de bloc souhaitée, et de toujours lire moins que la taille du bloc. Si la taille du tampon interne n'a pas été spécifiée lorsque le flux a été construit, 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 cette citation fait référence.

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

7voto

Bill the Lizard Points 147311

Je ne suis pas sûr qu'il soit possible d'envoyer directement un flux vers un autre en .NET, mais voici une méthode pour le faire avec un tampon d'octets intermédiaire. 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 votes

Vous pourriez l'implémenter comme une méthode d'extension en C# 3.0, et l'avoir comme quelque chose comme static void CopyTo(this Stream input, Stream output)...

5voto

Leonid Points 41

BufferedStream.CopyTo(Stream)

2voto

tim_yates Points 63521

Lire les données d'un FileStream dans un Stream générique

aura probablement quelques directions à prendre dans

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X