2009-06-29 5 views
27

이 C# 코드를 가정 : StreamWriter.flush()를 수행해야합니까?

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(); 
} 

내 질문

은 다음과 같습니다

  1. 내가 순서를 유지하기 위해 루프 내에서 플러시 사용해야합니까?
  2. MemoryStream.ToArray()이 합법적입니까? 나는 컨벤션으로 using -block을 사용하고 있는데, 나는 그것을 망쳐 놓을 것이다.

답변

24

이전 답변을 스크래치하십시오. 동일한 스트림에서 두 개의 래퍼를 사용하고 있다는 것을 눈치 채지 못했습니다. 저에게 다소 위험한 느낌입니다.

어느 쪽이든, 나는 StreamWriterBinaryWriter을 자신의 using 블록에 넣었습니다.

아, 그렇습니다. MemoryStream에서 ToArray()으로 전화하는 것은 합당합니다. 데이터는 폐기 된 후에도 그대로 유지됩니다. 당신이 정말로 두 래퍼를 사용하려면

,이처럼 할 거라고 :

내가 말할 필요가
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(); 
} 

, 그래도 같은 스트림 주위를 두 래퍼를 사용하여 다소 조심 해요. 홀수 데이터로 끝나지 않도록 각 작업 후에 각각을 계속 플러싱해야합니다. 당신은 상황을 완화하기 위해 true로 StreamWriterAutoFlush 속성을 설정할 수 있고, 나는 현재하지 실제로이 홍조를 필요로하지 않습니다 (즉,이 데이터를 버퍼링하지 않습니다)하지만에 의존하는 것은 위험 느낌BinaryWriter 있다고 생각 .

이진 데이터와 텍스트 데이터를 혼합해야한다면 BinaryWriter을 사용하고 문자열의 바이트를 명시 적으로 쓰고 Encoding.GetBytes(string)으로 가져옵니다.

+0

2 명의 스트림 작성자와 함께 하나의 스트림을 배치하는 것은 위험하지만/오류가 발생하는 것처럼 보입니다.하지만이 경우 플러시가 발생한다고 생각하지 않습니다. Flush는 MemoryStream의 읽기에는 영향을주지 않고 버퍼링 된 바이트를 각각의 스트림에 기록하는 데에만 영향을줍니다. – mbillard

+1

이것은 값이 기록되는 순서에 영향을 미칩니다. AutoFlush를 true로 설정하지 않으면 StreamWriter가 MemoryStream에 아무 것도 기록하지 않을 수도 있습니다. 그것은 단지 나에게 부서지기 쉬운 느낌이다. –

+0

문제는, 이름의 끝에 개행을 원하고 WriteLine이 그렇게 안전한 방법 인 것 같습니다. – Nefzen

0

업데이트

신경 끄시이 대답, 내가 ... 작가와 혼동있어

  1. 아니, 순서가 보존됩니다

    (갱신 : 어쩌면되지 않음). 플러시는 다른 상황에서 유용하거나 필요하지만 언제 기억할 수는 없습니다.
  2. 내 생각에 을 사용하면을 사용하면 모든 것이 잘 정리됩니다.
+0

바이너리 라이터와 스트림 라이터의 순서 *가 반드시 보존되지 않을 것이라고 생각합니다. 바이너리 라이터로부터의 값의로드와 다음의 스트림 라이터로부터의 값의로드로 끝날 가능성이 있습니다. –

+0

1. 순서가 유지되지 않습니다. 2.'using'은 normalWriter 나 binaryWriter를'Dispose()'하지 않습니다. – dss539

+0

두 작성자가 동일한 버퍼를 공유합니까? – mbillard

관련 문제