Question

Quelle est la différence entre instanciation d'un objet Stream, comme MemoryStream et appelant la méthode memoryStream.Write() à écrire dans le flux, et instanciation d'un objet StreamWriter avec le flux et appelant streamWriter.Write()?

Envisagez le scénario suivant:

Vous avez une méthode qui prend un flux, écrit une valeur, et le renvoie. Le flux est lu à partir plus tard, de sorte que la position doit être remis à zéro. Il y a deux façons de le faire (les deux semblent au travail).

// Instantiate a MemoryStream somewhere
//     - Passed to the following two methods
MemoryStream memoryStream = new MemoryStream();

// Not using a StreamWriter
private static Stream WriteToStream(Stream stream, string value)
{
    stream.Write(Encoding.Default.GetBytes(value), 0, value.Length);
    stream.Flush();
    stream.Position = 0;
    return stream;
}

// Using a StreamWriter
private static Stream WriteToStreamWithWriter(Stream stream, string value)
{
    StreamWriter sw = new StreamWriter(stream);
    sw.Write(value, 0, value.Length);
    sw.Flush();
    stream.Position = 0;
    return stream;
}

Ceci est en partie un problème de portée, car je ne veux pas fermer le flux après avoir écrit depuis qu'il sera lu à partir plus tard. Je aussi ne veux certainement pas disposer non plus, parce que cela va fermer mon flux. La différence semble être que ne pas utiliser un StreamWriter introduit une dépendance de direct sur Encoding.Default, mais je ne suis pas sûr qui est un très gros problème. Quelle est la différence, le cas échéant?

Était-ce utile?

La solution

Avec le StreamWriter vous avez plus haut niveau de surcharge qui peuvent écrire différents types au flux sans vous soucier des détails. Par exemple, votre code

sw.Write(value, 0, value.Length);

pourrait effectivement être juste

sw.Write(value);

Utilisation de la surcharge StreamWriter.Write (string).

Autres conseils

Une différence est que new StreamWriter(stream) par défaut utilise l'encodage UTF-8, il soutiendra les données Unicode. Encoding.Default (au moins sur ma machine) est une page de code de taille fixe (tels que Windows 1250) et prend en charge uniquement ASCII et un nombre limité de caractères nationaux (256 caractères différents au total).

Vous devriez vraiment pas faire ce qui suit:

stream.Write(encoding.GetBytes(value), 0, value.Length);

Il est juste une coïncidence que le codage que vous utilisez a une taille fixe de 1 octet. (Il ne fonctionnerait pas avec UTF-16 ou UTF-8 et les données non-ASCII.) Au lieu de cela, si vous avez besoin d'écrire directement à un flux, faites:

byte[] byteData=encoding.GetBytes(value);
stream.Write(byteData, 0, byteData.Length);

StreamWriter est une superclasse Stream qui met en œuvre un TextWriter pour faciliter la manipulation du texte. Mais depuis est une super classe, il a tous les mêmes méthodes, en plus de ceux de manipulation du texte. Ce pourquoi vous avez besoin Encoding.Default.GetBytes (valeur) dans le premier exemple et dans le second, vous ne le faites pas.

En termes de tableaux de byte[], rien, StreamWriter n'introduit d'autres méthodes plus utiles que pour travailler avec d'autres types.

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