보조 스트림이라는 것은 저번에 설명했던 바이트 단위 입출력 스트림, 문자 단위 입출력 스트림같이 실제 읽고 쓰는 스트림이 아닌 보조 기능을 제공하는 스트림입니다.

이러한 보조 스트림은 다른 스트림과 연결하여 기능을 제공해주는 역할을 합니다.

게다가 보조 스트림은 필터(Filter) 스트림이라고도 하는데, 왜냐하면 보조 스트림의 몇몇은 FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스들이기 때문입니다.

보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입출력 스트림에 연결해서 수행합니다. 또한, 보조 스트림에 또 다른 보조 스트림에도 연결되어 스트림 체인을 구성할 수 있습니다.

예를 들어, 다음과 같이 스트림 체일을 구성할 수 있습니다.

// 콘솔 입력 스트림
InputStream is = System.in;
// 문자 변환 보조 스트림에 연결
InputStreamReader reader = new InputStreamReader(is); 
// 문자 변환 보조 스트림을 다시 성능 향상 보조 스트림인 BufferedReadaer에 연결
BufferedReader br = new BufferedReader(reader);

InputStreamReader & OutputStreamWriter

InputStreamReader와 OutputStreamWriter는 바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림입니다.

콘솔 입력 스트림인 InputStreamReader 타입으로 변환할 수 있으며, 읽은 자료를 문자로 변환해주는 FileInputStream도 다음과 같이 Reader으로 변환할 수 있습니다.

InputStream is = System.in;
Reader reader1 = new InputStreamReader(is);

FileInputStream fis = new FileInputStream("reader.txt");
Reader reader2 = new InputStreamReader(fis);

또한, OutputStreamWriter도 문자 출력 스트림인 Writer로 변환시킵니다.

예를 들어, 파일 출력을 위한 FileOutputStream을 다음과 같이 Writer 타입으로 변환할 수 있습니다.

FileOutputStream fos = new FileOutputStream("output.txt");
Writer writer = new OutputStreamWriter(fos);

BufferedInputStream & BufferedOutputStream

BufferedInputStream & BufferedOutputStream 보조 스트림을 설명하기에 앞서, 성능 향상 보조 스트림에 알아야될 필요가 있습니다.

프로그램의 실행 성능은 입출력이 가장 늦은 하드 디스크의 처리 속도에 맞춰지기 때문에 속도가 느릴 수 있습니다. 그래서 중간에 메모리 버퍼(Buffer)와 작업함으로써 실행 성능을 향상 시킬 수 있습니다.

예를 들어, 데이터를 하드 디스크에 바로 보내지 않고 버퍼에 보냄으로써 데이터가 쌓이기를 기다렸다가 버퍼가 가득 차게 되면 데이터를 한꺼번에 하드 디스크로 보내면서 출력 횟수를 줄여줍니다.

이런 방식으로 성능 향상시켜주는 보조 스트림 중에서 바이트 기반으로 BufferedInputStream & BufferedOutputStream가 있습니다.

또한, 여기에 문자 기반으로 BufferedReader & BufferedWriter가 존재합니다.

BufferedInputStream과 BufferedReader는 입력 소스로부터 자신의 내부 버퍼 크기 만큼 데이터를 미리 읽고 버퍼에 저장해둡니다. 여기서 BufferedReader는 readLine() 메서드를 가지고 있으며, 이 메서드는 \r, \n로 구분된 행 단위의 문자열을 한꺼번에 읽습니다.

BufferedOutputStream과 BufferedWriter는 프로그램에서 전송한 데이터를 내부 버퍼에 쌓아두었다가 버퍼가 가득 차면, 버퍼의 모든 데이터를 한꺼번에 보냅니다. 주의할 점은 버퍼가 가득 찼을 때만 출력하기 때문에 마지막 부분이 버퍼에 남을 수 있습니다. 그래서 마지막 출력을 마친 후 flush() 메서드를 호출하여 버퍼에서 남아있는 데이터를 모두 보내야합니다.

이상으로 자바에서 사용하는 보조 스트림에 대해서 간단히 알아봤습니다.

profile
꾸준함으로 성장하는 개발자 지망생

0개의 댓글