인프런 커뮤니티 질문&답변

곽장현님의 프로필 이미지
곽장현

작성한 질문수

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

파일 입출력과 성능 최적화3 - Buffered 스트림 쓰기

BufferedOutputStream 질문입니다.

작성

·

76

0

[질문 내용]
CreateFileV3 코드에서

반복문을 돌고 fos로 보내는 메소드는없는데

어느 시점에서 버퍼에 담긴 데이터가 fos로 보내지는건가요?

bos.close() 때 강의에서 설명하신 내부적 flush() 실행으로 보내는줄 알았는데 아니더라구요.

 

반복문이 종료되는 시점에 보내지는지

아니면 버퍼가 가득찼을때 보내지는지.. 어느 시점인지 궁금합니다.

 

답변 2

0

안녕하세요. 곽장현님, 공식 서포터즈 y2gcoder입니다.

BufferedOutputStream의 write() 메서드 구현을 보시면 좋을 것 같습니다 🙂

image.png

캡처를 보시면 write()는 내부적으로 implWrite()를 호출하고 implWrite()는 버퍼의 길이와 count를 비교하여 버퍼를 flush 해주고 있습니다. 그러면 flushBuffer()로 가보면

image.png

설명에서도 보이듯이 내부 버퍼를 flush 해주는 기능을 하고 있습니다. 생성자를 통해 받았던 OutputStream(out)의 write()를 호출해주면서 이 때 버퍼를 비워주고 count 를 초기화하는 모습을 보실 수 있습니다.

AI 인턴의 설명과 더불어 제가 간단하게 설명 드린 내용을 바탕으로 직접 BufferedOutputStream 내부 구현을 살펴보시면 이해가 되실 거라 생각합니다 🙂

 

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 곽장현님!

BufferedOutputStream에 대해 궁금하신 점에 대한 설명을 드리겠습니다. BufferedOutputStream은 내부적으로 데이터를 버퍼링하고, 버퍼가 꽉 찼거나 스트림이 닫힐 때(close() 호출 시)에 버퍼에 저장된 데이터를 하위 스트림(FileOutputStream)으로 전송합니다.

  1. 버퍼가 가득 찼을 때: BufferedOutputStream은 지정된 크기의 버퍼를 사용합니다. 버퍼가 가득 차면, 자동으로 buffered된 내용을 하위 스트림으로 flush합니다. 이는 성능을 향상시키기 위한 방법으로, 자주 IO 연산을 수행하기보다는 모아서 한 번에 수행함으로써 비용을 줄이는 것입니다.

  2. 스트림이 닫힐 때 (bos.close()): close() 메서드를 호출하면 flush()가 자동으로 호출되어 버퍼에 남아 있는 데이터가 모두 하위 스트림으로 전송된 후 스트림이 닫힙니다.

따라서, BufferedOutputStream 내부의 버퍼가 꽉 차거나, 스트림을 닫을 때(close()) 남아 있는 데이터가 FileOutputStream으로 보내지게 됩니다.

유사한 질문들 및 답변이 여기에서 확인할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

곽장현님의 프로필 이미지
곽장현

작성한 질문수

질문하기