Làm xước câu trả lời trước - Tôi đã không nhận thấy rằng bạn đang sử dụng hai trình bao bọc xung quanh cùng một luồng. Điều đó có vẻ hơi mạo hiểm với tôi.
Dù bằng cách nào, tôi sẽ đặt StreamWriter
và BinaryWriter
trong các khối using
riêng của chúng.
Ồ, và có, đó là hợp pháp để gọi ToArray()
trên MemoryStream
- dữ liệu được giữ lại ngay cả sau khi nó được xử lý.
Nếu bạn thực sự muốn sử dụng hai hàm bao, tôi muốn làm điều đó như thế này:
using (MemoryStream stream = new MemoryStream())
{
using (StreamWriter normalWriter = new StreamWriter(stream))
using (BinaryWriter binaryWriter = new BinaryWriter(stream))
{
foreach(...)
{
binaryWriter.Write(number);
binaryWriter.Flush();
normalWriter.WriteLine(name); //<~~ easier to read afterward.
normalWriter.Flush();
}
}
return MemoryStream.ToArray();
}
tôi phải nói, tôi có phần thận trọng của việc sử dụng hai hàm bao quanh cùng một luồng mặc dù. Bạn sẽ phải tiếp tục xả mỗi người sau mỗi thao tác để đảm bảo bạn không kết thúc với dữ liệu lẻ. Bạn có thể đặt thuộc tính AutoFlush
của StreamWriter
thành true để giảm thiểu tình huống và tôi tin rằng BinaryWriter
hiện tại không thực sự yêu cầu xả nước (tức là không đệm bất kỳ dữ liệu nào) nhưng dựa vào điều đó có rủi ro.
Nếu bạn phải trộn dữ liệu nhị phân và văn bản, tôi muốn sử dụng một số BinaryWriter
và ghi rõ byte cho chuỗi, tìm nạp nó với Encoding.GetBytes(string)
.
Nguồn
2009-06-29 16:18:54
Gói một luồng với hai người viết luồng dường như nguy hiểm/dễ bị lỗi mặc dù tôi không nghĩ rằng họ sẽ làm bất cứ điều gì trong trường hợp này. Flush không ảnh hưởng đến việc đọc MemoryStream, chỉ việc ghi các byte đệm vào các luồng tương ứng của chúng. – mbillard
Nó ảnh hưởng đến thứ tự trong đó các giá trị có thể được viết mặc dù - trừ khi bạn đặt AutoFlush thành true, StreamWriter có thể không ghi bất kỳ thứ gì vào MemoryStream trong một thời gian dài (hoặc * luôn * nếu bạn không bỏ nó). Nó chỉ cảm thấy giòn với tôi. –
điều là, tôi muốn một dòng mới ở cuối tên, và WriteLine có vẻ là cách an toàn để như vậy. – Nefzen