보조 스트림 (Filter Stream)
보조 스트림은 데이터를 독립적으로 입출력할 수 있는 능력은 없지만, 다른 스트림을 감싸서(Wrapping) 새로운 기능(버퍼링, 데이터 형변환 등)을 추가해주는 스트림입니다. 이를 데코레이터 패턴(Decorator Pattern) 이라고 합니다.
1. 보조 스트림의 연결
보조 스트림을 사용하려면 먼저 데이터를 직접 주고받는 노드 스트림을 생성한 뒤, 생성된 노드 스트림을 보조 스트림의 생성자에 전달하여 연결합니다.
// 노드 스트림 생성
FileInputStream fis = new FileInputStream("test.txt");
// 보조 스트림(BufferedInputStream)으로 노드 스트림 감싸기
BufferedInputStream bis = new BufferedInputStream(fis);
// 데이터를 읽을 때는 보조 스트림의 메서드를 사용!
bis.read();
2. 주요 보조 스트림
보조 스트림은 성능 향상, 데이터 변환 등 목적에 따라 다양하게 제공됩니다.
1) 버퍼 보조 스트림 (Buffered)
입출력 시 하드 디스크에 너무 자주 접근하면 성능이 저하됩니다. 메모리 버퍼를 두어 데이터를 모았다가 한 번에 전송하게 해주는 가장 중요한 보조 스트림입니다. 거의 필수로 사용됩니다.
BufferedInputStream/BufferedOutputStreamBufferedReader/BufferedWriter(특히 BufferedReader의readLine()은 줄 단위로 텍스트를 읽을 수 있어 매우 유용합니다.)
2) 바이트를 문자로 변환 (InputStreamReader, OutputStreamWriter)
네트워크 등 외부로부터 바이트(Byte)로 데이터를 받았는데, 그것이 실제로는 텍스트일 때 이를 문자열 처리기인 Reader/Writer로 캐스팅(변환)해줍니다. 인코딩(UTF-8 등)도 지정할 수 있습니다.
public class FilterStreamExample {
public static void main(String[] args) throws Exception {
// System.in은 바이트 기반(InputStream)의 노드 스트림입니다.
// 이것을 문자로 변환하고(InputStreamReader), 버퍼 기능(BufferedReader)까지 입힙니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("입력하세요: ");
String line = br.readLine(); // 줄 단위로 편하게 읽음
System.out.println("입력된 문자열: " + line);
br.close();
}
}
이외에도 데이터를 타입별로 읽고 쓸 수 있는 DataInputStream, 객체를 기록하는 ObjectOutputStream 등 여러 보조 스트림들이 존재합니다.