2012-07-09 36 views
19

Giống như trong chủ đề: Tôi muốn đọc dữ liệu từ một tệp (từ luồng) vào bộ nhớ (bộ nhớ) để cải thiện tốc độ ứng dụng của tôi. Làm thế nào để làm nó?Làm thế nào để tải toàn bộ luồng vào MemoryStream?

+0

Bạn có thể sử dụng phương pháp StreamReader.ReadToEnd. Điều này sẽ đọc tất cả các tập tin vào một chuỗi. Tại sao bạn muốn đọc nó vào luồng? StreamReader sử dụng luồng để bạn có thể đọc từ luồng đó khi cần và đếm trên khung để tối ưu hóa mọi thứ. –

+0

@AmiramKorach: Đối với một điều, bạn giả sử đây là văn bản. StreamReader là * chỉ * thích hợp cho dữ liệu văn bản. –

Trả lời

51

Một vài lựa chọn:

đã đọc tất cả vào một mảng byte đầu tiên ...

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

Hoặc sử dụng phương thức CopyTo của .NET 4

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

Hoặc làm điều đó bằng tay

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

Tôi đã nhận thấy phương thức đầu tiên 'File.ReadAllBytes' hoạt động khá khác với phương thức" CopyTo "khi tiêu thụ bộ nhớ đi (.NET 4.5). Cụ thể, đọc hàng chục tệp trong một vòng lặp chặt chẽ với bộ nhớ 'File.ReadAllBytes' không được khai hoang cũng như phiên bản' CopyTo'. Có thể đáng để điều tra thêm. –

8

Nếu bạn có thể giữ toàn bộ tập tin trong bộ nhớ, File.ReadAllBytes nên làm việc cho bạn:

using (var ms = new MemoryStream(File.ReadAllBytes(file))) 
{ 
    // do work 
} 
Các vấn đề liên quan