Quelle est la différence entre l'appel de Stream.Write et l'utilisation d'un StreamWriter?
Quelle est la différence entre l'instanciation d'un Stream
objet, comme MemoryStream
et l'appel de la memoryStream.Write()
méthode pour écrire dans le flux, et l'instanciation d'un StreamWriter
objet avec le cours d'eau et de l'appel de streamWriter.Write()
?
Envisagez le scénario suivant:
Vous avez une méthode qui prend un Ruisseau, écrit une valeur, et le renvoie. Le flux est lu à partir de la suite, donc la position doit être réinitialisé. Il y a deux façons de le faire (les deux semblent fonctionner).
//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;
}
C'est en partie à une portée de problème, car je ne veux pas fermer le flux de données après avoir écrit pour elle car elle sera lue à partir plus tard. J'ai aussi ne veux certainement pas à jeter non plus, parce que cela va fermer mon stream. La différence semble être que vous n'utilisez pas un StreamWriter introduit une dépendance directe à l'Encodage.Par défaut, mais je ne suis pas sûr que c'est une très grosse affaire. Quelle est la différence, le cas échéant?
source d'informationauteur John Nelson
Vous devez vous connecter pour publier un commentaire.
Avec le StreamWriter vous avez de plus haut niveau des surcharges qui peuvent écrire différents types de flux sans vous soucier des détails. Par exemple, votre code
Pourrait en fait juste
À l'aide de la StreamWriter.Write(string) surcharge.
En termes de
byte[]
tableaux, rien,StreamWriter
n'introduire d'autres méthodes utiles si les pour travailler avec d'autres types.Une différence, c'est que
new StreamWriter(stream)
par défaut utilise l'encodage UTF-8, donc il sera en charge Unicode données. L'encodage.Par défaut (au moins sur ma machine) est d'une taille fixe de la page de code (comme Windows-1250) et prend en charge uniquement ASCII et un ensemble limité de caractères nationaux (256 caractères différents au total).Vous ne devriez vraiment pas faire ce qui suit:
stream.Write(encoding.GetBytes(value), 0, value.Length);
C'est juste une coïncidence que l'encodage que vous utilisez a une taille fixe de 1 octet. (Ça ne marcherait pas avec l'encodage UTF-16, ou avec de l'UTF-8 et les données non-ASCII.) Au lieu de cela, si vous avez besoin d'écrire directement à une rivière, à faire:
StreamWriter est une super-classe de Flux qui implémente une TextWriter pour faciliter la manipulation de texte. Mais depuis, c'est une super classe il a tous les mêmes méthodes en plus de la manipulation de texte. Ce pourquoi vous avez besoin de l'Encodage.Par défaut.GetBytes(valeur) dans le premier exemple et dans le deuxième, vous ne le font pas.