2011-09-12 3 views
4

StreamReader를 사용하여 기본 스트림을 처리하는 경우 더 이상 읽을 수 없어야한다고 생각했습니다.기본 스트림이 삭제 된 후에 StreamReader를 사용합니까?

이것이 사실이라면 this 질문을 제안합니다. 기본 스트림의 수명이 다른 곳에서 처리되는 경우 StreamWriter (해당 경우)를 삭제할 필요가없는 것이 좋습니다.

하지만 그건 사실이 아닙니다.

나는 파일이 내가이 다음을 실행

abc 
def 
ghi 

를 포함 delme.txt을 불렀다 :

Stream s = File.OpenRead(@"C:\delme.txt"); 
    StreamReader sr = new StreamReader(s, Encoding.ASCII); 

    Console.WriteLine(sr.ReadLine()); 

    s.Dispose(); 

    Console.WriteLine(sr.ReadLine()); 

그리고 그 결과는 다음과 같습니다

abc 
def 
내가 한 일은 다음이었다

어떻게 가능합니까?

답변

10

귀하의 StreamReader은 이미 다음 행을 해당 버퍼로 읽습니다.
버퍼의 데이터가 모두 소진 될 때까지 소스 Stream으로 돌아 가지 않습니다.

사실 Stream이 처리되었는지 여부를 알아낼 멱등환이 없기 때문에 예외를 throw 할 수 없습니다.

 Stream s = File.OpenRead(path); 
     StreamReader sr = new StreamReader(s, Encoding.ASCII); 

     Console.WriteLine(sr.ReadLine()); 

     s.Dispose(); 

     int i = 1; 
     try 
     { 
      while (!sr.EndOfStream) 
      { 
       Console.WriteLine(sr.ReadLine()); 
       i++; 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

     Console.WriteLine(i + " lines total"); 

     Console.ReadLine(); 
그것은 많은 출력됩니다

라인의 많은 :

+0

아, 감사합니다. 나는 완충제를 잊었다. –

5

은 (부부와 함께 천 개 텍스트 행을 파일 사용), 여기에 선보일 예정 대답 할 @SLaks에 추가하려면 (더 IsDisposed 특성이 없습니다) 몇 백인처럼 예외를 던질 것입니다. 내 출력은 다음과 같이 종료 :

우리가 네 번째 매개 변수로 매개 변수 bufferSize 소요 StreamReader의 생성자가있는 것을 볼 수 사실
qrs 
tuv 
wxy 
zab 
cde 
fgh 
ijk 
lmn 
Cannot access a closed file. 
204 lines total 

:

StreamReader sr = new StreamReader(s, Encoding.ASCII, false, 10000); 

10000를 사용하여, 그것은 실제로 총을 출력 추락하기 전에 나를 위해 1248 줄. 또한 사용할 수있는 가능한 가장 작은 값은 1이며,이 경우 25 행을 미리 가져옵니다.

+0

감사합니다. +1 코드 –

0

여기에서 이해해야 할 사항은 처리하려는 것입니다.

http://msdn.microsoft.com/en-us/library/ms227563.aspx

IT는 TextReader를 완료하면 TextReader를가 사용할 수없는 상태가 될 것이라고 말했습니다. 아마, 모든 것을 읽지 않았기 때문에, 그것은 끝난 것으로 간주되지 않습니다; 그러므로, 당신은 그것을 계속 사용할 수 있습니다. 그건 내 추측이다.

관련 문제