Est-ce que je dois faire StreamWriter.Flush ()?
-
21-08-2019 - |
Question
Supposons que le code C #:
using (MemoryStream stream = new MemoryStream())
{
StreamWriter normalWriter = new StreamWriter(stream);
BinaryWriter binaryWriter = new BinaryWriter(stream);
foreach(...)
{
binaryWriter.Write(number);
normalWriter.WriteLine(name); //<~~ easier to reader afterward.
}
return MemoryStream.ToArray();
}
Mes questions sont les suivantes:
- Ai-je besoin d'utiliser affleurant à l'intérieur du boucle pour préserver l'ordre?
- est de retour légal
MemoryStream.ToArray()
? J'utilisant leusing
-. Bloc comme une convention, je crains que cela va gâcher les choses
La solution
Grattez la réponse précédente - Je ne l'avais pas remarqué que vous utilisiez deux emballages dans le même flux. Cela me sent un peu risqué.
De toute façon, je mettrais la et StreamWriter
dans leurs propres BinaryWriter
blocs using
.
Oh, et oui, il est légal d'appeler au ToArray()
MemoryStream
-. Les données sont conservées même après qu'il est disposé à
Si vous voulez vraiment utiliser les deux emballages, je le ferais comme ceci:
using (MemoryStream stream = new MemoryStream())
{
using (StreamWriter normalWriter = new StreamWriter(stream))
using (BinaryWriter binaryWriter = new BinaryWriter(stream))
{
foreach(...)
{
binaryWriter.Write(number);
binaryWriter.Flush();
normalWriter.WriteLine(name); //<~~ easier to read afterward.
normalWriter.Flush();
}
}
return MemoryStream.ToArray();
}
Je dois dire, je suis un peu méfiant d'utiliser deux emballages dans le même flux que. Vous devrez garder le rinçage chacun d'eux après chaque opération pour vous assurer de ne pas se retrouver avec des données impaires. Vous pouvez définir AutoFlush rel="noreferrer"> Encoding.GetBytes(string)
propriété sur true pour atténuer la situation, et je croire qui ne <=> pas actuellement en fait nécessitent le rinçage (il ne cache pas de données), mais se fondant sur qui se sent risqué.
Si vous devez mélanger des données binaires et texte, j'utiliser un et écrire explicitement <=> les octets pour la chaîne, l'extraction avec <=>.
Autres conseils
Mise à jour
Passons cette réponse, je me suis embrouillé avec les écrivains ...
- Non, l'ordre sera préservé ( Mise à jour: peut-être pas). Flush est utile / nécessaire dans d'autres situations, bien que je ne me souviens pas quand.
- Je pense que oui, avec assure que tout nettoie bien.