[Java] File I/O close() and flush()

·2022년 11월 20일

JAVA

목록 보기
7/10

✅ 스트림 닫기를 잊지 마세요!

close()

close()는 스트림을 닫는 메소드다. 스트림의 사용이 끝났다면 호출해야 한다.

앞에서 자바는 프로그램 종료 시 사용한 파일 스트림을 알아서 닫긴 한다고 적었지만...
절대 GC에 의존하지 말고 철저히 스트림을 닫는 것을 확실하게 수행해야 한다. 무엇보다도 자원의 누수를 방지하는 것은 프로그래머로써 당연히 고려해야 하는 사항이지만, 예기치 못한 에러를 마주할 수 있으므로 사전에 마음에 새겨 두자.

우선 파일을 작성하는 경우에는 반드시 스트림을 닫아 주어야 한다. 파일에 확실한 끝을 전달하지 않으면 에러가 발생할 수 있다. 파일을 읽어들이는 경우에도 네트워크 메세지를 받는 등의 경우 문제가 발생할 수 있기 때문에 반드시 close()를 수행해 주도록 하자.
실제 서버에서 돌아가는 프로그램의 경우, 파일을 올린 후 바로 웹에서 확인하는 작업 등을 수행할 때 파일을 제대로 닫지 않으면 파일을 열 수 없어 문제가 발생한다... 이 때문에 폐를 끼친 경험이 있다. C부터 공부해 온 프로그래머라면 자존심을 걸고서라도 꼭 이런 사소한 실수는 방지할 수 있도록 하자...

언제나 close()를 통해 스트림을 닫는 것을 반드시 습관화하도록 하자.

 

flush()

한 마디로 말하자면, close()만 잘 한다면 쓸 필요 없다.

파일 출력을 수행할 때, 프로그램은 데이터를 버퍼에 우선 채운 다음 버퍼가 다 차면 파일에 작성하게 되어 있다.
flush()는 버퍼가 다 차지 않았더라도 파일에 데이터의 작성을 강제한다. 버퍼에 남은 데이터가 작성되지 않고 파일 작성이 종료되는 경우를 방지하기 위해 작성하는 메소드다.
하지만 close()를 호출하면 내부에서 버퍼에 남은 데이터를 flush한 다음 스트림을 닫게 된다. 때문에 close()를 잘 호출하고 있다면 굳이 스트림을 닫을 때 flush()와 close()를 같이 호출하지 않아도 된다.
또한 flush()에는 스트림을 닫는 기능은 없기 때문에 flush()를 close() 대신 호출하는 실수도 하지 않도록 유의하자.

0개의 댓글