Une élégante façon de consommer (tous les octets de l') BinaryReader?
Est-il un élégant pour émuler le StreamReader.ReadToEnd
méthode avec BinaryReader
? Peut-être de mettre tous les octets dans un tableau d'octets?
Je fais ceci:
read1.ReadBytes((int)read1.BaseStream.Length);
...mais il doit y avoir une meilleure façon.
Vous devez vous connecter pour publier un commentaire.
Il suffit de faire:
La la documentation dit qu'il va lire tous les octets jusqu'à la fin du flux est atteinte.
Mise à jour
Bien que cela semble élégant, et de la documentation semble indiquer que ce serait le travail, la mise en œuvre (archivé .NET 2, 3,5 et 4) alloue un tableau d'octets pour les données, qui sera probablement entraîner une
OutOfMemoryException
sur un système 32 bits.Donc, je dirais qu'effectivement il n'y a pas une manière élégante.
Au lieu de cela, je vous recommande la suite de la variation de @soit la réponse. Cette variante ne repose pas sur .NET 4:
Créer une méthode d'extension pour
BinaryReader
(ouStream
, le code est le même pour les deux).int.MaxValue
nombres entiers de 32 bits, vous serez l'allocation de 8 go de mémoire ... c'est pourquoi vous devez construire les résultats à l'aide des petits tampons!Il n'est pas un facile façon de le faire avec BinaryReader. Si vous ne connaissez pas le comte, vous avez besoin de lire à l'avance, un meilleur pari est d'utiliser MemoryStream:
Pour éviter la copie supplémentaire lors de l'appel de
ToArray()
, vous pouvez retourner lePosition
et tampon, viaGetBuffer()
.Stream.CopyTo
est uniquement disponible en .NET 4.Stream
mais sonLength
propriété était toujours à zéro. J'ai d'abord essayé une extension de la méthode basée sur l'approche, mais a estimé qu'il était lourd.yourBinaryReader.BaseStream
Pour copier le contenu d'un flux à l'autre, j'ai résolu la lecture de "certains" octets jusqu'à la fin du fichier est atteinte:
Une autre approche de ce problème est d'utiliser le C# les méthodes d'extension:
À l'aide de cette approche permettra à la fois réutilisables ainsi qu'un code lisible.