[Naver 지식인] C# 의 StreamReader 클래스에서 Seek가 작동하지 않는 이유

개발 노트/지식 In  2012.10.06 23:22



 

안녕하세요. 개발자 명월입니다.

지식인 질문 내용입니다.

 

 

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040102&docId=159102932

 

재미있는 질문입니다. StreamReader에서 Seek가 왜 되질 않을까 하는 질문입니다. 저도 StreamReader 를 자주 사용하는 편이라 궁금증이 생겨 한번 확인 해 봤습니다.

 

근데 이 글의 답변은 MSDN에서 친절히 설명이 되어있어서 조금은 김이 샜네요..

바로가기 - StreamReader.Read() 메서드

 

 

말이 어려운데 분명이 데이터를 버퍼로 읽은 후 내부 스트림의 위치가 일치하지 않을 수 있다고 쓰여있습니다.

즉 StreamReader는 FileStream에서 읽어 드릴때 버퍼로 한번 쭉 읽어 드린다는 것을 알 수 있습니다. 설명 보다는 예제로 알아 보겠습니다.

 

 

0부터 99까지 되는 데이트를 쭉 입력 해 보았습니다.

 

 

StreamReader로 읽어 보겠습니다.

 

 

위 소스를 보시면은 제가 두번읽고 초기화해서 100만큼 이동을 합니다.

그런후 포지션 값 내보내고 값 내고 다시 포지션값을 보겠습니다.

 

 

버퍼 초기화를 한후 포지션 이동할 때는 작동을 하는게 분명히 보이나 Read를 하고 나서는 Position이 맨 끝으로 가버렸네요. 즉 Read를 할때 Buffer로 File이 다 읽혀버리는 현상이 발생하는 것이지요. 그래서 MSDN에서도 남용을 하면 심각한 성능 저하가 나타난다고 명시 되어있습니다.

 

이것이 해결할 방법은. 버퍼스트림을 사용하지 않는것입니다.

분명 StreamReader, StreamWriter 는 사용하기 편하게 헬퍼 클래스의 역할을 하나 기능이 많이 축소되어 있는게 사실입니다. 즉 헬퍼 스트림을 사용하지 않고 직접 파일에 접근을 하면 말끔히 해결 되겠습니다.

 

 

 

여기서는 Seek가 제대로 작동을 합니다.

 

관련 소스 : kin20121006.zip

 


댓글 1개가 달렸습니다.
댓글쓰기
  1. good
    2016.07.08 20:09 신고 |  수정/삭제  댓글쓰기

    세밀한 분석 감사드립니다.