Question

Quel est le moyen le plus efficace de lire un flux dans un autre flux? Dans ce cas, j'essaie de lire les données d'un Filestream dans un flux générique. Je sais que je pourrais faire ce qui suit:
1. lire ligne par ligne et écrire les données dans le flux
2. lire des morceaux d'octets et écrire dans le flux
3. etc

J'essaie simplement de trouver le moyen le plus efficace.

Merci

Était-ce utile?

La solution

Stephen Toub décrit un pipeline de flux dans sa colonne MSDN .NET Matters ici . Dans l'article, il décrit une méthode CopyStream () qui copie d'un flux d'entrée vers un autre flux. Cela ressemble assez à ce que vous essayez de faire.

Autres conseils

J'ai rassemblé une méthode d'extension rapide (donc VS 2008 w / 3.5 uniquement):

public static class StreamCopier
{
   private const long DefaultStreamChunkSize = 0x1000;

   public static void CopyTo(this Stream from, Stream to)
   {
      if (!from.CanRead || !to.CanWrite)
      {
         return;
      }

      var buffer = from.CanSeek
         ? new byte[from.Length]
         : new byte[DefaultStreamChunkSize];
      int read;

      while ((read = from.Read(buffer, 0, buffer.Length)) > 0)
      {
        to.Write(buffer, 0, read);
      }
   }
}

Il peut être utilisé ainsi:

 using (var input = File.OpenRead(@"C:\wrnpc12.txt"))
 using (var output = File.OpenWrite(@"C:\wrnpc12.bak"))
 {
    input.CopyTo(output);
 }

Vous pouvez également légèrement modifier la logique et écrire une méthode CopyFrom () .

Lire un tampon d’octets puis l’écrire est le plus rapide. Des méthodes telles que ReadLine () doivent rechercher des délimiteurs de ligne, ce qui prend plus de temps que de simplement remplir un tampon.

Je suppose que par flux générique, vous entendez tout autre type de flux, comme un flux de mémoire, etc.

Si tel est le cas, le moyen le plus efficace consiste à lire des fragments d'octets et à les écrire dans le flux du destinataire. La taille du bloc peut être quelque chose comme 512 octets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top