2012-07-09 10 views
19

Podobnie jak w temacie: Chcę odczytywać dane z pliku (ze strumienia) do pamięci (memorystream), aby poprawić szybkość mojej aplikacji. Jak to zrobić?Jak załadować cały strumień do MemoryStream?

+0

Można użyć metody StreamReader.ReadToEnd. Spowoduje to odczytanie całego pliku do ciągu znaków. Dlaczego chcesz go przeczytać w strumieniu? StreamReader używa strumienia, dzięki czemu można go odczytać w razie potrzeby i liczyć na strukturę do optymalizacji. –

+0

@AmiramKorach: Po pierwsze, zakładasz, że to jest tekst. StreamReader jest * tylko * odpowiedni dla danych tekstowych. –

Odpowiedz

51

Kilka opcji:

Czytaj wszystko w pierwszej tablicy bajtów ...

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

Lub użyj metody CopyTo .NET 4

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

lub zrobić to ręcznie

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

Zauważyłem, że pierwsza metoda "File.ReadAllBytes' zachowuje się całkiem inaczej niż metoda" CopyTo ", jeśli chodzi o zużycie pamięci (.NET 4.5). W szczególności czytanie kilkudziesięciu plików w ciasnej pętli z pamięcią 'File.ReadAllBytes' nie jest odzyskiwane, podobnie jak wersja' CopyTo'. Może być wart więcej dochodzenia. –

8

Jeśli można trzymać cały plik w pamięci File.ReadAllBytes powinny pracować dla Ciebie:

using (var ms = new MemoryStream(File.ReadAllBytes(file))) 
{ 
    // do work 
} 
Powiązane problemy