상세 컨텐츠

본문 제목

바이트기반 보조스트림

자바강좌

by somiyuralove 2019. 6. 29. 09:34

본문

FilterInputStream / FilterOutputStream은 InputStream/OutputStream의 자손이면서 모든 보조스트림의 조상입니다.

보조스트림은 자체적으로 입출력을 수행할 수 없기 때문에 기반스트림을 필요로 합니다.

FilterInputStream/FilterOutputStream의 모든 메서드는 단순히 기반스트림의 메서드를 그대로 호출할 뿐입니다.

FilterInputStream/FilterOutputStream자체로는 아무런 일도 하지 않음을 의미합니다.

FilterInputStream/FilterOutputStream는 상속을 통해 원하는 작업을 수행하도록 읽고 쓰는 메서드를 오버라이딩해야합니다.

생성자 FilterInputStream는 접근 제어자가 protected이기 때문에 FilterInputStream의 인스턴스를 생성해서 사용할 수 없고 상속을 통해서 오버라이딩되어야 합니다.

BufferedInputStream/BufferOutputStream은 스트림의 입출력 효율을 높이기 위해 버퍼를 사용하는 보조스트림입니다. 한 바이트씩 입출력하는 것 보다는 버퍼(바이트배열)를 이용해서 한 번에 여러 바이트를 입출력하는 것이 빠르기 때문에 대부분의 입출력 작업에 사용됩니다.

BufferedInputStream의 버퍼크기는 입력소스로부터 한 번에 가져올 수 있는 데이터의 크기로 지정하면 좋습니다. 보통 입력소스가 파일인 경우 보통 작게는 1024부터 2048 또는 4096 정도의 크기로 하는 것이 보통이며, 버퍼의 크기를 변경해가면서 테스트하면 최적의 버퍼크기를 알아낼 수 있습니다.

프로그램에서 입력소스로부터 데이터를 읽기 위해 처음으로 read메서드를 호출하면, BufferedInputStream은 입력소스로 부터 버퍼 크기만큼의 데이터를 읽어다 자신의 내부버퍼에 저장합니다.

이제 프로그램에서는 BufferedInputStream의 버퍼에 저장된 데이터를 읽으면 되는 것입니다. 외부의 입력소스로 부터 읽는 것보다 내부의 버퍼로 부터 읽는 것이 훨씬 빠르기 때문에 그만큼 작업 효율이 높아집니다.

프로그램에서 버퍼에 저장된 모든 데이터를 다 읽고 그 다음 데이터를 읽기위해 read메서드가 호출되면, BufferedInputStream은 입력소스로부터 다시 버퍼크기 만큼의 데이터를 읽어다 버퍼에 저장해 놓습니다.

이와 같은 작업이 계속 반복됩니다.

BufferedOutputStream 역시 버퍼를 이용해서 출력소스와 작업을 하게 되는데, 입력소스로부터 데이터를 읽을 때와는 반대로, 프로그램에서 write메서드를 이용한 출력이 BufferedOutputStream의 버퍼에 저장됩니다. 버퍼가 가득차면, 그 때 버퍼의 모든 내용을 출력소스에 출력합니다. 그러고는 버퍼를 비우고 다시 프로그램으로부터의 출력 저장할 준비를 합니다.

버퍼가 가득 찾을 때문 출력소스에 출력을 하기 때문에, 마지막 출력부분의 출력소스에 쓰여지지 못하고 BufferedOutputStream의 버퍼에 남아있는 채로 프로그램이 종료될 수 있다는 점을 주의해야합니다.

그래서 프로그램에서 모든 출력작업을 마친 후 BufferedOutputStream에 close()나 flush()를 호출해서 마지막에 버퍼에 있는 모든 내용이 출력소스에 출력되도록 해야 합니다.

 

'자바강좌' 카테고리의 다른 글

SequenceInputStream  (0) 2019.07.01
DataInputStream과 DataOutputStream  (0) 2019.06.30
자바 입출력  (0) 2019.05.10
애플릿(Applet)  (0) 2019.05.09
AWT 그래픽 - paint(), Grphics,repaint(), Image  (3) 2019.05.08

관련글 더보기

댓글 영역