549 votes

Meilleure façon de copier entre deux instances de flux

Quel est le meilleur moyen de copier le contenu d'un flux dans un autre? Existe-t-il une méthode d'utilité standard pour cela?

726voto

Nick Points 7173

Partir de .NET 4.5, il est l' Stream.CopyToAsync méthode

input.CopyToAsync(output);

Cela retournera Task qui peut être poursuivi sur une fois rempli, comme suit:

await input.CopyToAsync(output)

// Code from here on will be run in a continuation.

Notez que selon l'endroit où l'appel à l' CopyToAsync , le code qui suit peut ou ne peut pas continuer sur le même thread qui l'a appelée.

L' SynchronizationContext qui a été capturé lors de l'appel d' await permettra de déterminer quel est le fil que la suite sera exécutée.

En outre, cet appel (et c'est un détail d'implémentation sous réserve de modification) encore des séquences de lectures et d'écritures (il n'a tout simplement pas perdre un fils de blocage sur les I/O d'achèvement).

Partir de .NET 4.0, il est l' Stream.CopyTo méthode

input.CopyTo(output);

Pour .NET 3.5 et avant

Il n'y a pas tout cuit dans le cadre de l'aider avec cela; vous devez copier le contenu manuellement, comme suit:

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write (buffer, 0, read);
    }
}

72voto

Joshua Points 1578

MemoryStream a. WriteTo(outstream) ;

et .NET 4.0 a. CopyTo sur l’objet de flux normal.

.NET 4.0 :

33voto

Eloff Points 5224

J’utilise les méthodes d’extension suivants. Ils ont optimisé les surcharges pour quand un seul flux est un MemoryStream.

1voto

fryguybob Points 2886

Les questions de base que se différencient les implémentations de "CopyStream" sont:

  • la taille de la lecture de la mémoire tampon
  • la taille de l'écrit
  • Peut-on utiliser plus d'un thread (l'écriture alors que nous sommes à la lecture).

Les réponses à ces questions entraîner très différentes implémentations de CopyStream et sont dépendantes de ce type de flux que vous avez et ce que vous essayez d'optimiser. Le "meilleur" de la mise en œuvre serait même besoin de savoir ce matériel spécifique les cours d'eau de la lecture et de l'écriture.

1voto

Conor Points 11
<pre><code></code><p>Utilisez pause plutôt que le retour. Le retrun empêche l’entrée. Position = TempPos d’être exécutés.</p></pre>

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