Supposons ce 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:
MemoryStream.ToArray()
est légal? En utilisant le bloc using
- comme convention, je crains que cela ne gâche tout.Grattez la réponse précédente - je n'avais pas remarqué que vous utilisiez deux wrappers autour du même flux. Cela me semble un peu risqué.
Quoi qu'il en soit, je mettrais les StreamWriter
et BinaryWriter
dans leurs propres blocs using
.
Oh, et oui, il est légal d'appeler ToArray()
sur la MemoryStream
- les données sont conservées même après leur suppression.
Si vous voulez vraiment utiliser les deux wrappers, 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 que je suis toutefois un peu méfiant quant à l'utilisation de deux wrappers dans le même flux. Vous devrez continuer à vider chacun d'eux après chaque opération pour vous assurer de ne pas vous retrouver avec des données impaires. Vous pouvez définir la StreamWriter
's AutoFlush
property sur true pour atténuer la situation, et I croire que BinaryWriter
ne le fait pas en fait nécessite un vidage (c.-à-d. données), mais il est risqué de s’en remettre à cela.
Si vous devez mélanger des données binaires et textuelles, j'utiliserais une BinaryWriter
et écrirais explicitement les octets de la chaîne, en le récupérant avec Encoding.GetBytes(string)
.
Mettre à jour
Peu importe cette réponse, je me suis confondu avec les écrivains ...