자바/입출력 IO

바이트 기반의 보조 스트림의 자손: Buffered 입출력 스트림

백_곰 2022. 4. 24. 20:07

1. BufferedInputStream과 BufferedOutputStream

- 앞서 봤을 수도 있겠지만, 이 보조 스트림은 입출력 효율을 높이기 위해 버퍼를 사용한다.

 

- 즉, 한 바이트씩 입출력하는 것 보다는 버퍼를 이용해서 한 번에 여러 바이트를 입출력하는 것이

빠르다.

 

- 아래는 Buffered 입력 스트림생성자이다.

 

(1) BufferedInputStream(InputStream in)

:  InputStream의 인스턴스 in을 입력소스로 하며, 크기를 지정하지 않았으므로, 8192byte 크기의 버퍼를

갖게 된다.

 

(2) BufferedInputStream(InputStream in, int size)

: InputStream의 인스턴스 in을 입력소스로 하며, 지정된 size의 값 크기(byte 단위)의 버퍼를 갖는

인스턴스를 생성한다.

 

 

 

- 아래는 Buffered 출력 스트림의 생성자이다.

 

(1) BufferedOutputStream(OutputStream out)

: OutputStream의 인스턴스를 출력소스로 하며, 크기를 지정하지 않았으므로, 8192byte 크기의 버퍼를

갖게 된다.

 

(2) BufferedOutputStream(OutputStream out, int size)

: OutputStream의 인스턴스를 출력소스로 하며 지정된 크기(byte 단위)의 버퍼를 갖는 인스턴스를

생성한다.

 

(3) flush()

: 버퍼의 모든 내용을 출력소스에 출력한 다음, 버퍼를 비운다.

 

(4) close()

: flush() 수행 후, BufferedOutputStream의 인스턴스가 사용하던 모든 자원을 반환한다.

 

 

( 주의할 점은 버퍼가 가득 찼을 때만 출력소스에 출력하기 때문에, 마지막 출력부분이 출력소스에 쓰이지 못하고

남아있는 채로 종료될 수 있다. )

( 그러므로, BufferedOutputStreamflush()close()를 호출해서 남아있는 부분이 있는지 확인해야 한다. )

 

 

 

 

1-1. Buffered 입출력 스트림을 이해하기 위한 예제(1)

 

( 예상했던 결과와 달리 6,7,8,9가 출력되지 않았다. )

( 그 이유는 위에서 말했듯이 flush()close()를 사용하지 않았기 때문이다. )

 

( 그러므로, fos.close() 위에 bos.flush() bos.close()를 사용해야 한다. )

( 또한 bos.close()를 사용하게 되면 기반(주) 스트림인 FileOutputStreamclose()를 호출하기 때문에,

따로 fos.close()를 해줄 필요 없다. )

 

( 추가적으로 보조 스트림의 조상인 FilterOutputStreamclose() 안에는 flush()가 선언되어 있으므로, 

close()만 호출하면 된다. )