2012-07-09 19 views
19

Me gusta en el tema: Quiero leer datos de un archivo (de la secuencia) en la memoria (memorystream) para mejorar la velocidad de mi aplicación. ¿Cómo hacerlo?¿Cómo cargar toda la secuencia en MemoryStream?

+0

Usted puede utilizar el método StreamReader.ReadToEnd. Esto leerá todo el archivo en una cadena. ¿Por qué quieres leerlo en una transmisión? StreamReader usa una secuencia para que pueda leer de ella según lo necesite y contar con el marco para optimizar las cosas. –

+0

@AmiramKorach: Por un lado, supones que esto es texto. StreamReader es * solo * apropiado para datos de texto. –

Respuesta

51

algunas opciones:

leerlo todo en una matriz de bytes primera ...

byte[] data = File.ReadAllBytes(file); 
MemoryStream stream = new MemoryStream(data); 

O uso .NET método CopyTo de 4

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

o hacerlo 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

Me he dado cuenta de que el primer método 'File.ReadAllBytes' se comporta bastante diferente al método de" CopyTo "en lo que respecta al consumo de memoria (.NET 4.5). Específicamente, la lectura de decenas de archivos en un ciclo cerrado con la memoria 'File.ReadAllBytes' no se recupera tan bien como la versión' CopyTo'. Podría valer más investigación. –

8

Si puede mantener el archivo completo en la memoria, File.ReadAllBytes debe trabajar para usted:

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