1.1 입출력이란?

입출력은 컴퓨터 내부 또는 외부의 장치와 프로그램 간의 데이터를 주고받는 것을 말한다.

1.2 스트림(stream)

자바에서 입출력을 수행하려면, 즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림(stream) 이라고 정의했다. 스트림이란 데이터를 운반하는데 사용되는 연결 통로이다.

스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다. 그래서 입력과 출력을 동시에 수행하려면 입력을 위한 입력스트림과 출력을 위한 출력스트림, 모두 2개의 스트림이 필요하다.

1.4 보조 스트림

보조스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 데이터를 입출력할 수 있는 기능은 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다. 그래서 보조스트림만으로는 입출력을 처리할 수 없고, 스트림을 먼저 생성한 다음에 이를 이용해서 보조스트림을 생성해야 한다.

// 기반스트림 생성
FileInputStream fis = new FileInputStream("test.txt");

// 보조스트림 생성
BufferedInputStream bis = new BufferedInputStream(fis);

bis.read();

보조스트림인 BufferedInputStream 은 버퍼만을 제공한다. 버퍼를 사용한 입출력과 사용하지 않은 입출력간의 성능 차이는 상당하기 때문에 대부분의 경우에 버퍼를 이용한 보조 스트림을 사용한다.

1.5 문자기반 스트림 - Reader, Writer

이전에 알아본 스트림은 모두 바이트기반의 스트림이었다. Java 에서는 한 문자를 의미하는 char 형이 1byte 가 아닌 2byte 이기 때문에 바이트기반의 스트림으로 문자를 처리하기에는 어려움이 있다.

이 점을 보완하기 위해 문자 기반의 스트림이 제공된다. 문자데이터를 입출력할 때는 바이트기반 스트림대신 문자 기반 스트림을 사용하자.

InputStream → Reader

OutputStream → Writer

보조스트림의 사용목적도 바이트기반 보조스트림과 유사하다.