2012-07-09 9 views
19

Come nell'argomento: Voglio leggere i dati da un file (dal flusso) in memoria (memorystream) per migliorare la velocità della mia app. Come farlo?Come caricare l'intero flusso in MemoryStream?

+0

È possibile utilizzare il metodo StreamReader.ReadToEnd. Questo leggerà tutto il file in una stringa. Perché vuoi leggerlo in un flusso? StreamReader utilizza uno stream in modo che tu possa leggerlo come necessario e contare sul framework per ottimizzare le cose. –

+0

@AmiramKorach: Per prima cosa, stai assumendo che questo sia un testo. StreamReader è * solo * appropriato per i dati di testo. –

risposta

51

Alcune opzioni:

leggere il tutto in un array di byte prima ...

Oppure utilizzare il metodo CopyTo di .NET 4

MemoryStream memoryStream = new MemoryStream(); 
using (Stream input = File.OpenRead(file)) 
{ 
    input.CopyTo(memoryStream); 
} 
memoryStream.Position = 0; 

o farlo manualmente

MemoryStream memoryStream = new MemoryStream(); 
using (Stream input = File.OpenRead(file)) 
{ 
    byte[] buffer = new byte[32 * 1024]; // 32K buffer for example 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     memoryStream.Write(buffer, 0, bytesRead); 
    } 
} 
memoryStream.Position = 0; 
+0

Ho notato che il primo metodo 'File.ReadAllBytes' si comporta in modo molto diverso dal metodo" CopyTo "per quanto riguarda il consumo di memoria (.NET 4.5). In particolare, la lettura di dozzine di file in un loop stretto con la memoria 'File.ReadAllBytes' non viene recuperata così come la versione' CopyTo'. Potrebbe valere qualche altra indagine. –

8

Se si riesce a contenere l'intero file in memoria, File.ReadAllBytes dovrebbe funzionare per voi:

using (var ms = new MemoryStream(File.ReadAllBytes(file))) 
{ 
    // do work 
} 
Problemi correlati