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?
19
A
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
- 1. Làm thế nào để ngăn chặn Delphi ADO tải toàn bộ bảng vào bộ nhớ?
- 2. Lưu bitmap vào MemoryStream
- 3. Làm thế nào để chuyển MemoryStream qua WCF Streaming
- 4. RestSharp đang tải toàn bộ tệp vào bộ nhớ khi tải lên. Làm thế nào để tránh nó?
- 5. Phụ thêm vào MemoryStream
- 6. Làm cách nào để đọc/phát tệp mà không tải toàn bộ tệp vào bộ nhớ?
- 7. Làm thế nào để CopyOnWriteArrayList có thể an toàn luồng?
- 8. Lưu và tải MemoryStream vào/từ một tập tin
- 9. StreamWriter ghi vào MemoryStream
- 10. Đọc Luồng tới một MemoryStream trong nhiều chủ đề
- 11. Cách lấy MemoryStream từ luồng trong .NET?
- 12. Làm cách nào để đặt một WebResponse vào luồng bộ nhớ?
- 13. Trình tải tệp JS lên, tức là không tải toàn bộ tệp vào bộ nhớ
- 14. Làm cách nào để tải lên tệp và lưu tệp đó vào Luồng để xem trước thêm bằng C#?
- 15. Làm thế nào để không tải xuống toàn bộ thư mục với (rùa) SVN
- 16. Làm thế nào để cập nhật một UITableViewCell mà không cần tải lại toàn bộ bảng
- 17. Luồng có an toàn không?
- 18. C# Đúc MemoryStream để FileStream
- 19. Làm thế nào để grep cho toàn bộ từ
- 20. làm thế nào để so sánh toàn bộ đậu java?
- 21. Làm thế nào để in toàn bộ mảng NumPy?
- 22. Làm cách nào để tải lại div mà không cần tải lại toàn bộ trang?
- 23. Làm thế nào để đổ toàn bộ dữ liệu POST vào một tập tin trong ASP.NET
- 24. Delphi, FileStream và MemoryStream
- 25. DotNetZip Lưu vào luồng
- 26. Làm thế nào tôi có thể tải toàn bộ một tập tin vào một chuỗi trong C
- 27. Làm thế nào để tải bộ đệm hiện tại vào trình thông dịch Python trong Emacs?
- 28. Tải luồng byte lên Google Drive qua luồng đầu vào
- 29. Làm thế nào để xác định các biến tĩnh cục bộ luồng cục bộ?
- 30. Nhà điều hành luồng quá tải an toàn >>
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ứ. –
@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. –