2009-12-19 4 views
17

Ein nützlicher in .NET 4 eingeführter Vorteil ist Stream.CopyTo(Stream[, Int32]), der den Inhalt aus dem aktuellen Stream liest und in einem anderen Stream schreibt.Wie wird die Stream.CopyTo (Stream) -Methode in .NET 4 implementiert?

Dadurch entfällt die Notwendigkeit für etwas mühsam code such as this:

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[32768]; 
    while (true) 
    { 
     int read = input.Read (buffer, 0, buffer.Length); 
     if (read <= 0) 
      return; 
     output.Write (buffer, 0, read); 
    } 
} 

Da ich nicht über 4 .NET auf diesem Computer installiert, ich habe mich gefragt, ob jemand, der konnte öffnen Reflektor installiert .NET 4 hat und Zeigen Sie uns, wie das Framework-Klassenbibliotheksteam diese Methode für .NET 4 implementiert hat.

Vergleichen Sie ihre Implementierung mit dem obigen Code-Snippet. Insbesondere interessiert mich, welche Standard-Puffergröße gewählt wurde.

+0

funktioniert kopieren auf Netzwerkstream? – Benny

+0

Gute Frage. Nicht sicher ... vielleicht kann einer der Leute, die .NET 4 installiert haben, es ausprobieren? –

+0

es scheint, dass es auf Netzwerkstream funktioniert. – Benny

Antwort

16

In .NET 4.5.1 verwendet es eine feste Puffergröße von 81920 Bytes. (Frühere Versionen von .NET verwendeten eine feste Puffergröße von 4096 Bytes, und es wird sich zweifellos im Laufe der Zeit ändern.) Es gibt auch eine Überladung, bei der Sie Ihre eigene Puffergröße übergeben können.

Die Implementierung ist sehr ähnlich zu Ihrem, modulo einige schlurfen herum und einige Fehler zu überprüfen. Reflector macht das Herz es wie folgt: (. Sie können jetzt die eigentliche Quelle bei http://referencesource.microsoft.com/#mscorlib/system/io/stream.cs#98ac7cf3acb04bb1 sehen)

private void InternalCopyTo(Stream destination, int bufferSize) 
{ 
    int num; 
    byte[] buffer = new byte[bufferSize]; 
    while ((num = this.Read(buffer, 0, buffer.Length)) != 0) 
    { 
    destination.Write(buffer, 0, num); 
    } 
} 

Die Fehlerüberprüfung ist im Grunde darum, ob input.CanRead und output.CanWrite beide wahr sind, oder beides ist entsorgt. Als Antwort auf die Frage von Benny sollte das vollkommen glücklich sein, von einem NetworkStream (oder einem beschreibbaren NetworkStream) zu kopieren.

+0

Ich denke, die Idee ist, genau eine Seite für den Puffer zu verwenden? – Yuliy

+4

Es ist eine "glückliche Zahl" für Puffergrößen. Es ist sehr unwahrscheinlich, dass es genau auf eine Seitengrenze fällt. –

+1

Es ist auch klein genug, um nicht auf dem großen Objekt-Heap zugewiesen zu werden. – skolima

Verwandte Themen