Làm cách nào để đọc Luồng và đặt lại vị trí của nó về 0 ngay cả khi stream.CanSeek == false
? Tôi cần một số công việc xung quanh.Cách đọc Luồng và đặt lại vị trí của nó về 0 ngay cả khi stream.CanSeek == false
Trả lời
Nếu kịch bản cho phép bạn thay thế luồng ban đầu, bạn có thể kiểm tra xem nó có hỗ trợ tìm kiếm hay không, đọc nội dung và đưa chúng vào một MemoryStream
mới.
static string PeekStream(ref Stream stream)
{
string content;
var reader = new StreamReader(stream);
content = reader.ReadToEnd();
if (stream.CanSeek)
{
stream.Seek(0, SeekOrigin.Begin);
}
else
{
stream.Dispose();
stream = new MemoryStream(Encoding.UTF8.GetBytes(content));
}
return content;
}
Điều trên là không hiệu quả vì nó phải cấp phát bộ nhớ gấp đôi kích thước nội dung của bạn. Đề xuất của tôi sẽ là điều chỉnh các phần của mã mà bạn đang truy cập luồng (sau khi đã đọc tất cả nội dung của nó) để làm cho chúng truy cập vào bản sao nội dung được lưu trữ thay thế. Ví dụ:
string content;
using (var reader = new StreamReader(stream))
content = reader.ReadToEnd();
// Process content here.
string line;
using (var reader = new StringReader(content))
while ((line = reader.ReadLine()) != null)
Console.WriteLine(line);
Kể từ khi StringReader
chỉ đọc từ content
chuỗi của bạn, bạn sẽ không lãng phí bộ nhớ tạo bản sao dự phòng dữ liệu của bạn.
Cách tiếp cận này là chính xác cho đến khi bạn có dữ liệu rất lớn. Nếu bạn có một số gigabyte thì bạn nên khởi động lại luồng của mình tốt hơn. Theo tôi, mục đích của phát trực tuyến là không lưu trữ tất cả dữ liệu bạn đang xử lý. –
Bạn nói đúng về 'MemoryStream' không phù hợp với dữ liệu lớn. Việc lưu trữ hay khởi tạo lại luồng phụ thuộc vào kịch bản. Ví dụ: nếu bạn đang xử lý dữ liệu được tải xuống từ Internet và bạn cần phải đọc nhiều lần, thì tốt hơn là lưu trữ dữ liệu cục bộ (trong bộ nhớ hoặc trong tệp tạm thời) để tải xuống lại. – Douglas
Sử dụng triển khai Luồng khác hỗ trợ tìm kiếm. Nếu Stream.CanSeek
trả về false, thì việc triển khai đó khẳng định rằng nó không hỗ trợ tìm kiếm.
Đối tượng MemoryStream
không hỗ trợ tìm kiếm. Bạn có thể sao chép luồng tùy ý vào MemoryStream bằng cách sử dụng thứ gì đó như thế này và luồng kết quả sẽ hỗ trợ tìm kiếm, ví dụ: bạn có thể đặt lại vị trí thành 0 và đọc từ vị trí liên tục.
MemoryStream CopyStreamToMemory(Stream inputStream)
{
MemoryStream ret = new MemoryStream();
const int BUFFER_SIZE = 1024;
byte[] buf = new byte[BUFFER_SIZE];
int bytesread = 0;
while ((bytesread = inputStream.Read(buf, 0, BUFFER_SIZE)) > 0)
ret.Write(buf, 0, bytesread);
ret.Position = 0;
return ret;
}
Tất nhiên, nếu luồng của bạn đọc dữ liệu không thay đổi, bạn có thể chỉ cần bỏ luồng cũ và tạo luồng mới đọc cùng một dữ liệu.
- 1. Luồng có vị trí viết và đọc riêng biệt
- 2. Cách đặt vị trí trên cùng = 0 sau setStatusBarHidden: Có?
- 3. socket connect() trả về 0 ngay cả sau khi thiết lập lại ngang hàng
- 4. Cách đặt lại vị trí cuộn của UITableView?
- 5. Stream.Seek (0, SeekOrigin.Begin) hoặc vị trí = 0
- 6. C++ bool trả về 0 1 thay vì false false
- 7. đặt lại vị trí div dựa trên vị trí nhấp
- 8. PHP được xác định() tại sao nó trả về false, ngay cả khi hằng số được xác định?
- 9. Phương thức lấy vị trí xem trả lại 0
- 10. Cách đặt vị trí của hộp thoại?
- 11. Truyền lại TCP tiếp tục ngay cả sau khi cờ RST đặt lại xuất hiện
- 12. AudioTrack khởi động lại ngay cả sau khi nó dừng lại
- 13. Dịch vụ định vị trong Safari di động: Không cho phép lưu ... mãi mãi? Ngay cả khi đặt lại
- 14. Tải xuống nội dung của URL trong PHP ngay cả khi nó trả về 404
- 15. Tôi có thể đặt lại vị trí của con trỏ về đầu không?
- 16. Testing cho tham chiếu null luôn trả về false ... ngay cả khi vô
- 17. `java (0% 2! = 0) == false`
- 18. Theo dõi vị trí của dòng của trình tạo luồng
- 19. Javascript - Đặt lại setInterval về 0
- 20. Tôi có cần đặt lại luồng (C#) về đầu không?
- 21. Đặt vị trí của MessageBox?
- 22. Sử dụng vị trí: tuyệt đối trong khi vẫn giữ nó trong luồng tài liệu
- 23. Cách chuyển đổi "0" và "1" thành false và true
- 24. facebook javascript sdk UI thoại đặt lại vị trí cuộn
- 25. Java - file.length() trả về ngay cả khi tệp không đọc được
- 26. PHP: Is_numeric trả về false trên 0
- 27. Android: Đặt lại vị trí hoạt ảnh sau khi hoàn thành
- 28. Không thể kéo UITableViewCell từ vị trí hiện tại của nó khi sắp xếp lại
- 29. ImageView và đặt vị trí
- 30. Chiều cao của div cha mẹ bằng 0 ngay cả khi nó có con với chiều cao hữu hạn
Nếu 'CanSeek == false', bất kỳ nỗ lực nào như vậy có thể dẫn đến ngoại lệ. – Oded
@oded; tôi biết điều đó; thats lý do tại sao tôi hỏi câu hỏi – Faisal