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?
Réponses
Trop de publicités?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);
}
}
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.