2013-06-28 6 views
2

나는 MemoryStream에 많은 데이터를 가지고 있는데이 모든 것을 BinaryWriter에 쓰려고합니다.MemoryStream에서 BinaryWriter.BaseStream으로 직접 데이터를 복사 하시겠습니까?

내게 모든 행운은 이제 Stream.CopyTo(Stream) method이며, BinaryWriter.BaseStream property에서 대상 스트림을 얻을 수 있습니다.

public void WriteTo(BinaryWriter writer) 
{ 
    this.memoryStream.CopyTo(writer.BaseStream); 
} 

내가 안전하게 같은 작가를 우회 할 수 있으며 기본 스트림에 직접 복사하거나 것이 엉망 작가의 버퍼, 위치, 또는 뭔가? 또는 StreamBinaryWriter 번으로 복사 하시겠습니까?

+0

http://msdn.microsoft.com/en-us/library/dd782932.aspx에 따르면, "복사는 현재의 현재 위치에서 시작 흐름." – Gray

+0

@ 그레이 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ BinaryWriter의 위치와는 관련이 거의 없습니다. – Virtlink

+0

나는 단지 여기에서 추측하고있다, 내가 당신을 인도하게하지 마라. 나는 이것의 실제 구현을 설명하는 것 같다 : http://stackoverflow.com/questions/16341653/filestream-copytonet-connectstream-what-happens-intern 이것을 우연히 만났어. – Gray

답변

2

당신이 초기 스트림에있는 데이터를 엉망으로하지 않을 경우는 것이 작품처럼하지 뭔가 : 당신이 4 + .NET을 사용하는 경우

 var myStreamInitially = new MemoryStream(); 
     var myStreamClone = new MemoryStream(); 

     myStreamInitially.CopyTo(myStreamClone); 

     var binaryWriteb = new BinaryWriter(myStreamClone); 

는하는 CopyTo 방법은 매우 편리합니다 . 당신은 예외를 받기를하려고하면

void WriteToStreamInUnknownStatus(BinaryWriter binaryWriter) 
    { 
     var myStream = new MemoryStream(); 

     try 
     { 
      binaryWriter.Write(myStream.ToArray()); 
     } 
     catch 
     { } 
    } 

업데이트 2

: UPDATE

이 다음 더 안전한 binaryStream 기본 baseStream 변화보다가 "메모리 스트림을 펼칠 수 없습니다. "

static void Main(string[] args) 
    { 
     var binaryWrite = new BinaryWriter(new MemoryStream(new byte[] {1, 2, 3, 4})); 

     binaryWrite.Seek(3, SeekOrigin.Begin); 

     var position = binaryWrite.BaseStream.Position; 

     new MemoryStream(new byte[] {1, 2, 3, 4}).CopyTo(binaryWrite.BaseStream); 

     position = binaryWrite.BaseStream.Position; 
    } 

따라서 속성이 스레드로부터 안전해야한다는 것 외에 내부 스트림의 유형을 알아야합니다. IMO 위험에 처한다. 당신이 제안 무엇

+0

음, 메소드의 입력으로'BinaryWriter'를 얻습니다. 그 작가는 내가 그것을 얻기 전에 물건을 쓰고 있을지도 모른다. 그리고 내가 끝내면 물건을 쓸지도 모른다. 그래서 나는 정말로 그것의'BinaryWriter' (또는 그것의 기본 스트림)을 사용할 필요가 있고 새로운 것을 만들 수 없습니다. – Virtlink

+0

@Virtlink 그렇다면 binaryWrite의 상태를 알 수 없어 왜 쓰기 메서드를 사용하여 메모리 스트림의 내용을 쓸 수 없습니까? – Marco

+0

확실히 할 수 있지만 그렇게하는 것이 안전하다면 더 쉽습니다. – Virtlink

2

제공, 안전 : 당신이 단일 스레드 컨텍스트에서 이것을 사용하고

  1. . 다른 스레드가 없거나 이것을 호출 할 때 작성자에 대해 독점적 인 잠금을가집니다. ... AND
  2. BaseStream에 직접 쓰려면 먼저 Flush으로 전화하십시오. 작성자는 아직 스트림에 기록하지 않은 일부 데이터를 버퍼링 할 수 있습니다.

그래서 수정 된 코드는 다음과 같습니다

public void WriteTo(BinaryWriter writer) 
{ 
    writer.Flush(); 
    this.memoryStream.CopyTo(writer.BaseStream); 
}