Es hängt wirklich davon ab, ob Sie vertrauen können oder nicht s.Length
. Bei vielen Streams wissen Sie einfach nicht, wie viele Daten vorhanden sein werden. In solchen Fällen - und vor .NET 4 - würde ich folgenden Code 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 - erstellen Sie den MemoryStream
, rufen Sie auf stream.CopyTo(ms)
und kehren Sie dann zurück ms.ToArray()
. Job 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 beispielsweise aus einem Netzwerk-Stream lesen, liest dieser möglicherweise den Wert eines Pakets und kehrt dann zurück, selbst wenn bald weitere Daten vorliegen. BinaryReader.Read
wird bis zum Ende des Streams oder Ihrer angegebenen Größe fortgesetzt, aber Sie müssen zunächst noch die Größe kennen.
Bei der obigen Methode wird so lange gelesen (und in a kopiert MemoryStream
), bis keine Daten mehr vorhanden sind. Anschließend wird der Benutzer MemoryStream
aufgefordert, eine Kopie der Daten in einem Array zurückzugeben. Wenn Sie zunächst die Größe kennen - oder glauben , die Größe zu kennen, ohne sich sicher zu sein -, können Sie die Größe zunächst so konstruieren MemoryStream
, dass sie diese Größe hat. Ebenso können Sie am Ende ein Häkchen setzen. Wenn die Länge des Streams der Größe des Puffers entspricht (zurückgegeben von MemoryStream.GetBuffer
), können Sie den Puffer einfach zurückgeben. Der obige Code ist also nicht ganz optimiert, wird aber zumindest korrekt sein. Es übernimmt keine Verantwortung für das Schließen des Streams - der Anrufer sollte dies tun.
Weitere Informationen (und eine alternative Implementierung) finden Sie in diesem Artikel .