2009-06-29 8 views
27

Giả sử C mã này #:Tôi có cần làm StreamWriter.flush() không?

using (MemoryStream stream = new MemoryStream()) 
{ 
    StreamWriter normalWriter = new StreamWriter(stream); 
    BinaryWriter binaryWriter = new BinaryWriter(stream); 

    foreach(...) 
    { 
     binaryWriter.Write(number); 
     normalWriter.WriteLine(name); //<~~ easier to reader afterward. 
    } 

    return MemoryStream.ToArray(); 
} 

Câu hỏi của tôi là:

  1. Tôi có cần phải sử dụng tuôn ra bên trong vòng lặp để giữ gìn trật tự?
  2. Đang trả lại MemoryStream.ToArray() hợp pháp? Tôi sử dụng khóa using làm quy ước, tôi e rằng nó sẽ làm mọi thứ rối tung lên.

Trả lời

24

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 StreamWriterBinaryWriter 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).

+0

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

+1

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. –

+0

đ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

0

Cập nhật

Nevermind câu trả lời này, tôi đã nhầm lẫn với những nhà văn ...


  1. Không, thứ tự sẽ được duy trì (update: có thể không). Flush rất hữu ích/cần thiết trong các tình huống khác, mặc dù tôi không thể nhớ khi nào.
  2. Tôi nghĩ vậy, sử dụng đảm bảo rằng mọi thứ đều hoạt động tốt.
+0

Tôi không nghĩ rằng thứ tự * sẽ nhất thiết phải được giữ nguyên, giữa trình ghi nhị phân và trình ghi luồng tại đây - bạn có thể kết thúc với một tải giá trị từ trình ghi nhị phân và sau đó là giá trị bộ đệm tiếp theo của trình ghi luồng. –

+0

1. Không có thứ tự sẽ không được giữ nguyên. 2. Không có 'using' không' Dispose() 'normalWriter hoặc binaryWriter. – dss539

+0

Cả hai nhà văn đều chia sẻ cùng một bộ đệm? – mbillard