Es hängt wirklich davon ab, ob Sie den folgenden Dingen vertrauen können oder nicht s.Length
. Bei vielen Datenströmen weiß man einfach nicht, wie viele Daten anfallen werden. In solchen Fällen - und vor .NET 4 - würde ich Code wie diesen verwenden:
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
Mit .NET 4 und höher, würde ich verwenden Stream.CopyTo
, was im Grunde der Schleife in meinem Code entspricht - die MemoryStream
anrufen stream.CopyTo(ms)
und dann zurück ms.ToArray()
. Auftrag erledigt.
Ich sollte vielleicht erklären, warum meine Antwort länger ist als die der anderen. Stream.Read
garantiert nicht, dass es alles liest, wonach es gefragt wird. Wenn Sie z. B. aus einem Netzwerkstrom lesen, kann es sein, dass er ein Paket liest und dann zurückkehrt, auch wenn es bald mehr Daten geben wird. BinaryReader.Read
wird bis zum Ende des Streams oder der von Ihnen angegebenen Größe fortgesetzt, aber Sie müssen trotzdem die Größe kennen, mit der Sie beginnen.
Die obige Methode liest (und kopiert in eine MemoryStream
), bis die Daten aufgebraucht sind. Dann fragt er die MemoryStream
um eine Kopie der Daten in einem Array zurückzugeben. Wenn Sie die Größe kennen, mit der Sie beginnen wollen - oder denken Sie kennen die Größe, ohne sicher zu sein - Sie können die MemoryStream
zu Beginn so groß sein. Ebenso können Sie eine Prüfung am Ende einfügen, und wenn die Länge des Streams die gleiche Größe wie der Puffer hat (zurückgegeben von MemoryStream.GetBuffer
), dann können Sie einfach den Puffer zurückgeben. Der obige Code ist also nicht ganz optimiert, aber er ist zumindest korrekt. Er übernimmt keine Verantwortung für das Schließen des Streams - das sollte der Aufrufer tun.
Voir dieser Artikel für weitere Informationen (und eine alternative Implementierung).