2012-05-18 1 views
24

Response.OutputStream을 통해 이미지를 반환하는 HttpHandler가 있습니다. 나는 다음과 같은 코드가 있습니다 :Stream.CopyTo와 MemoryStream.WriteTo의 차이

_imageProvider.GetImage().CopyTo(context.Response.OutputStream); 

GetImage() 방법은 실제로 MemoryStream 인스턴스이며이 브라우저에 0 바이트를 반환 이는 Stream을 반환합니다. 내가 GetImage() 방법 서명을 변경하면 MemoryStream을 반환하고 다음 코드 줄을 사용합니다 :

_imageProvider.GetImage().WriteTo(context.Response.OutputStream); 

그것은 작동하고 브라우저가 이미지를 얻을 수 있습니다. WriteTo와 CopyTo의 차이점은 무엇입니까? MemoryStream 클래스에서는 Stream 클래스를 사용하여 GetImage() 메서드 서명에이 방법을 사용하는 것이 좋습니다.

답변

38

WriteTo()은 데이터를 복사하기 전에 읽기 위치를 0으로 재설정합니다. 반면에 CopyTo()은 스트림의 현재 위치 다음에 남아있는 데이터를 복사합니다. 즉, 직접 위치를 재설정하지 않으면 데이터가 전혀 읽히지 않습니다.

방금 ​​당신의 첫 번째 버전에 다음과 같은 그리워 대부분의 경우 :이가 사용하는 CopyTo() 메서드 정의입니다

memoryStream.Position = 0; 
+1

writtoo isnt 동안 copyTo가 소스를 유지한다고 생각합니다. –

+5

어디서 정보를 얻었습니까? 너는 공급 링크를 기쁘게 할 수 있니? –

+0

뇌의 신경 세포가 공개적으로 접근 할 수 있기를 바랍니다. – viento

9

반사판에 따르면 : 내가보고 해달라고

private void InternalCopyTo(Stream destination, int bufferSize) 
{ 
    int num; 
    byte[] buffer = new byte[bufferSize]; 
    while ((num = this.Read(buffer, 0, buffer.Length)) != 0) 
    { 
     destination.Write(buffer, 0, num); 
    } 
} 

어떤 "메커니즘 남아 "여기 ... this부터 대상 (버퍼 크기의 블록)까지 모든 것을 복사합니다.

+0

@nnnnb 화면이 출력됩니까? 문서화? –

+0

사과, 내 의견을 무시하십시오 - 내 실수 - 2 filestreams 사이에 복사하고 CopyTo 호출하기 전에 스트림 중 하나를 되감기 잊어 버렸습니다. CopyTo는 + BrokenGlass가 설명한 것처럼 작동합니다 – StuartLC

+4

페이지를 일관되게 유지하기 위해 _IternalCopyTo_ 메서드가 현재 스트림의 _Reads_를 버퍼에 설명했습니다 - 스트림의 현재 위치에서 읽기가 시작됩니다 (인덱스 및 오프셋 매개 변수는 버퍼의 인덱스 및 오프셋 임). 그것은 "유적 메커니즘" –