2009-12-19 2 views
17

.NET 4에 도입 된 유용한 편리함은 Stream.CopyTo(Stream[, Int32])이며 현재 스트림에서 내용을 읽고 다른 스트림에 씁니다..NET 4에서 Stream.CopyTo (Stream) 메서드는 어떻게 구현됩니까?

이 약간 지루한 code such as this의 필요성 제거한다 :

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[32768]; 
    while (true) 
    { 
     int read = input.Read (buffer, 0, buffer.Length); 
     if (read <= 0) 
      return; 
     output.Write (buffer, 0, read); 
    } 
} 

내가 .NET 4가이 컴퓨터에 설치되어 있지 않기 때문에를, 내가 궁금하면 반사경을 열 수 설치된 .NET 4를 가진 사람과 프레임 워크 클래스 라이브러리 팀이 .NET 4에서이 메서드를 구현 한 방법을 보여줍니다.

위의 코드 조각과 구현을 비교하고 대조하십시오. 특히, 기본 버퍼 크기를 선택하는 데 관심이 있습니다.

+0

복사가 네트워크 스트림에서 작동합니까? – Benny

+0

좋은 질문입니다. 확실하지 않습니다 ... 어쩌면 .NET 4가 설치된 사람들 중 한 명이 그것을 시도 할 수 있습니까? –

+0

그것은 네트워크 스트림에서 작동 할 수 있습니다. – Benny

답변

16

.NET 4.5.1에서는 81920 바이트의 고정 버퍼 크기를 사용합니다. (이전 버전의 .NET에서는 고정 버퍼 크기가 4096 바이트 였으므로 시간이 지남에 따라 계속 변경 될 것입니다.) 또한 자체 버퍼 크기를 전달할 수있는 오버로드가 있습니다.

구현은 사용자와 매우 유사하며, 일부 모듈을 뒤적 거리며 일부 오류 검사를 수행합니다. 다음과 같이 반사판은 그것의 마음을 렌더링 : (. 이제 http://referencesource.microsoft.com/#mscorlib/system/io/stream.cs#98ac7cf3acb04bb1에서의 실제 소스를 볼 수 있습니다)

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

오류 검사가 input.CanRead 및 output.CanWrite 모두 해당 여부 주위에 기본적으로, 또는 어느 하나가 배치된다. 따라서 Benny의 질문에 대한 답변으로 NetworkStream (또는 쓰기 가능한 NetworkStream)에서 완벽하게 행복하게 복사해야합니다.

+0

제가 생각하기에 단지 정확히 1 페이지의 버퍼를 사용하는 것입니까? – Yuliy

+4

버퍼 크기가 "행복한 번호"입니다. 페이지 경계에 정확히 맞을 가능성은 거의 없습니다. –

+1

또한 대형 오브젝트 힙에 할당되지 않을 정도로 작습니다. – skolima

관련 문제