2014-06-22 6 views

답변

2

스트림이 "리디렉션"되지 않습니다. 대신 DeflateStream.Read 은 소스 스트림의 Read 메서드을 래핑합니다. 인

는 권취 DeflateStream 읽기가 그것에 호출 될 때, 그것은 (적어도 한, 그것은 유효 출력을 생산할 수있는 바와 같이) 소스 스트림을 판독하도록 상기 소스 스트림 (즉 생성자)에 전달되고 처리 된 결과를 자신의 Read 구현에서 반환합니다. 인해 Subtyping (and Inclusion Polymorphism)

에 따르는 (그리고 하위 유형) IO.Stream은 소스 스트림으로서 공급 될 수있는 개체. DeflateStream 코드와 관련하여 랩 된 _stream에 적절한 Read 메소드가 있는지 확인합니다.

생성자에 공급 실제 스트림 오브젝트

Polymorphism (C# Programming Guide)Polymorphism in .NET - CodeProject (런타임 다형성 섹션)에 대한 참조 등하여 FileStream, MemoryStream을하는 ResourceStream하는 ConnectedStream로서 구현 될 수

추가 세부 사항.

source found here에서

1 , 그 금액을 알 수있다 :

public override int Read(byte[] array, int offset, int count) { 
    // Setup state 

    while(true) { 
     // Process buffer into result until.. 
     bytesRead = inflater.Inflate(array, currentOffset, remainingCount); 
     if(remainingCount == 0) { 
      // ..read enough, break 
     } 
     if (inflater.Finished()) { 
      // ..or end of source stream, break 
     } 
     // Making sure to read more from the source stream as required 
     // (_stream is a Stream, assigned in the constructor) 
     int bytes = _stream.Read(buffer, 0, buffer.Length); 
     inflater.SetInput(buffer, 0 , bytes); 
    } 

    // .. 
} 
+0

감사합니다 -하지만 _stream는 System.Net.ConnectedStream을 System.IO.Stream으로 정의되지 않으며, 그래서 코드가 ConnectedStream.read에 도착하는 방법은 아직 명확하지 않습니다. – user2210021

+0

. 기본적으로 .NET은 ConnectionStream을 여기에 부과하지 않고, 읽고있는 코드는 ConnectStream을 사용하여 deflateStream 객체를 생성합니까? DeflatStream.read는 항상 ConnectSteam.read를 호출하고 .NET에 의해 구현되었습니다. – user2210021

+0

@ user2210021 수정. .NET은 "스트림"만 제공하면되고, 전달 된 실제 객체가 일치하는 구현 인 한 계속 작동합니다. "실제"Read 메소드는 하위 유형 다형성 (Read 메소드가 가상 임)으로 인해 런타임에 호출됩니다. 일부 링크를 추가했습니다. 덕분에 – user2864740