2016-08-26 2 views
3

스트림이 이미 다른 BinaryWriter에 의해 사용되는 동안 새로운 BinaryWriter를 만들고 스트림에 쓸 수 있습니까?동일한 스트림에서 여러 BinaryWriter를 사용할 수 있습니까?

일부 데이터를 재귀 적으로 작성해야하지만 스트림을 전달해야하므로 BinaryWriter를 매개 변수로 전달하지 않도록합니다. 따라서 스트림에 데이터를 쓰는 각 메서드는 자체 BinaryWriter 인스턴스를 만들어야 할 수 있습니다. 그러나 이것이 옳은지 나는 모른다. 지금은 FileStream에서 잘 작동하지만 사용자 컴퓨터에서 예기치 않은 결과가 발생할 수 있는지 여부는 알 수 없습니다.

저는 제가 성취하고자하는 간단한 예를 썼습니다. 이 BinaryWriter의 사용이 잘못 되었습니까?

예 :

public Main() 
{ 
    using (var ms = new MemoryStream()) 
    { 
     // Write data on the stream. 
     WriteData(ms); 
    } 
} 

private void WriteData(Stream output) 
{ 
    // Create and use a BinaryWriter to use only on this method. 
    using (var bWriter = new BinaryWriter(output, Encoding.UTF8, true)) 
    { 
     // Write some data using this BinaryWriter. 
     bWriter.Write("example data string"); 
     // Send the stream to other method and write some more data there. 
     WriteMoreData(output); 
     // Write some more data using this BinaryWriter. 
     bWriter.Write("another example data string"); 
    } 
} 

private void WriteMoreData(Stream output) 
{ 
    // Create and use a BinaryWriter to use only on this method. 
    using (var bWriter = new BinaryWriter(output, Encoding.Unicode, true)) 
    { 
     // Write some data on this BinaryWriter. 
     bWriter.Write("write even more example data here"); 
    } 
} 
+0

왜 재귀 적으로 만들지 않습니까? –

+0

나에게 괜찮아 보인다. 물론 사용자에게 코드를 보내기 전에 가능한 많은 문제를 파악하기 위해 모든 일반적인 테스트를 거쳐야합니다. 그때까지는 코드가 의도 한대로 작동한다는 확신을 가져야합니다. –

+0

그리고 BinaryWriter의 다른 인스턴스를 사용하여 스트림에 쓰기 전에 BinaryWriter에서 Flush()를 호출해야합니까? –

답변

2

가 잘못 BinaryWriter의 사용인가?

정상적으로 작동합니다. BinaryWriter은 자체적으로 버퍼링을하지 않으므로 각 인스턴스는 다른 인스턴스가 작성한 데이터를 간섭하지 않습니다. leaveOpen 매개 변수에 true을 전달하므로 각 인스턴스가 삭제 될 때 기본 스트림을 닫지 않습니다.

그러나 "잘못된"것은 보는 사람의 눈에는 어느 정도 있습니다. 나는 BinaryWriter을 전달하는 것이 더 낫다고 말하고 싶습니다.

MemoryStream은 버퍼링되지 않지만 다른 유형이 있습니다. BinaryWriter의 각 인스턴스는 삭제 될 때 스트림을 플러시합니다. 버퍼링의 이점을 최소한으로 부분적으로 무효화하기 때문에 일부 사람들은 비효율적이라고 생각할 수 있습니다. 여기서 문제는 아니지만 들어가기에 좋은 습관이 아닐 수도 있습니다.

또한 BinaryWriter의 각 인스턴스는 가비지 수집기에 대한 추가 작업을 생성합니다. 실제로 몇 가지 경우에만 문제가되지 않습니다. 그러나 실제 사례에 더 많은 호출이 필요한 경우, 특히 기본 스트림이 MemoryStream 일 때 (즉, 느린 장치 I/O를 처리하지 않는 경우) 특히 눈에 띄게 될 수 있습니다.

요즘까지 동일한 스트림에서 복수 BinaryWriter 인스턴스를 사용하는 것보다 명확한 인스턴스가 표시되지 않습니다. 자연스럽고, 읽기 쉽고, 쉽게 유지 관리되는 일은 하나의 BinaryWriter을 작성하고 작성을 마칠 때까지 다시 사용하는 것입니다.

왜 매개 변수로 전달하지 않으시겠습니까? 이미 Stream을 전달하고 있습니다. 대신 BinaryWriter을 전달하십시오. 기본 스트림에 직접 액세스해야하는 경우 항상 BinaryWriter.BaseStream을 통해 사용할 수 있습니다.

결론 : 분명히 아무 것도 없다고 말할 수는 없습니다. 제안 내용과 함께 그 자체가 잘못되었습니다. 그러나 정상적인 협약과의 차이는 (나에게 어쨌든) 분명한 이점이 없다. 이런 식으로하는 것이 정말 좋은 근거가된다면 효과가 있습니다. 그러나 나는 그것을 반대하는 것이 좋습니다.

+0

이것은 내 질문에 아주 잘 대답합니다. Stream을 매개 변수로 전달하는 것이 었습니다. 주로 스트림을 사용하여 일부 메서드에서 XDocument.Save()를 사용하여 데이터를 작성해야하기 때문에 BinaryWriter.BaseStream을 사용하는 것이 훨씬 의미가 있습니다. 나는 어떤 종류의 버퍼링을 사용하는 BinaryWriter에 대해 확신하지 못했고 당신의 대답이 그 정보를 제공했다. 고맙습니다! :) –

관련 문제