2008-09-24 3 views
5

Was ist der effizienteste Weg, um einen Stream in einen anderen Stream zu lesen? In diesem Fall versuche ich Daten in einem Filestream in einen generischen Stream zu lesen. Ich weiß, ich könnte folgendes tun: Zeile
1. Leseleitung und die Daten an den Strom
2. Lese Stücke von Bytes schreiben und
3. etcLesen von Daten in FileStream in einen generischen Stream

in den Stream schreiben bin ich nur versucht, um den effizientesten Weg zu finden.

Dank

+0

Was meinst du mit effizient? Das war das schnellste, verwendet die geringste Menge an Speicher oder andere Kriterien? –

Antwort

7

Stephen Toub diskutiert eine Stream-Pipeline in seiner MSDN .NET-Angelegenheitspalte here. In dem Artikel beschreibt er eine CopyStream() -Methode, die von einem Eingabestream in einen anderen Stream kopiert. Das klingt ziemlich ähnlich zu dem, was Sie versuchen zu tun.

+0

Ich mochte diesen Artikel für die parallele Aufgaben Perspektive, aber diese Stream-Kopie ist sehr nützlich für sich. Wenn der Stream jedoch die Length-Eigenschaft unterstützt (wenn CanSeek false ist, Ausnahme), sollte der Puffer die Länge des Eingabestreams haben und in einem einzigen Lesevorgang erfolgen. –

1

einen Puffer von Bytes Lesen und Schreiben, dann ist es am schnellsten. Methoden wie ReadLine() müssen nach Zeilenbegrenzern suchen, was mehr Zeit in Anspruch nimmt, als nur einen Puffer zu füllen.

0

ich durch generischen Strom übernehme, meinen Sie jede andere Art von Strom, wie ein Speicher-Stream usw.

Wenn ja, der effizienteste Weg ist, Stücke von Bytes zu lesen und sie an den Empfänger Stream schreiben. Die Chunk-Größe kann ungefähr 512 Bytes betragen.

7

Ich rollte zusammen, um eine schnelle Erweiterung Methode (so VS 2008 w/3.5 only):

public static class StreamCopier 
{ 
    private const long DefaultStreamChunkSize = 0x1000; 

    public static void CopyTo(this Stream from, Stream to) 
    { 
     if (!from.CanRead || !to.CanWrite) 
     { 
     return; 
     } 

     var buffer = from.CanSeek 
     ? new byte[from.Length] 
     : new byte[DefaultStreamChunkSize]; 
     int read; 

     while ((read = from.Read(buffer, 0, buffer.Length)) > 0) 
     { 
     to.Write(buffer, 0, read); 
     } 
    } 
} 

Es kann somit verwendet werden:

using (var input = File.OpenRead(@"C:\wrnpc12.txt")) 
using (var output = File.OpenWrite(@"C:\wrnpc12.bak")) 
{ 
    input.CopyTo(output); 
} 

Sie tauschen auch die Logik um leicht und Schreibe auch eine CopyFrom() Methode.

Verwandte Themen