Stream / Buffer / Channel 기반의 I/O
I/O 는 input, output 의 줄임말로써 줄여서 입출력이라고 한다. 콘솔창에서 입출력을 할 수도 있고, 파일 같은 곳에서도 입출력을 할 수도 있다.
기본적으로 stream 기반으로 동작한다.
Stream I/O
데이터가 흐르는 통로이다. 바이트 단위로 데이터가 흐른다.
FIFO(First-In-First-Out) 구조로 동작하며 양방향으로 동작하지 않는다. 즉, 입력할 때는 입력 stream, 출력할 때는 출력 stream을 사용해야 한다.
하나의 stream 으로 입출력을 할 수 없다.
Stream I/O 는 데이터 하나씩 처리하기 때문에 성능 이슈가 있다. 또한, 양방향 구조를 사용할 수 없는 특징도 있다.
이러한 점들을 개선하기 위해 Buffer, Channel 기반 I/O 가 있다.
Buffer I/O
바이트 단위로 데이터를 읽고 쓰는 데에 성능 개선을 위해서 나온 개념이다.
한 바이트씩 읽고, 쓰는 것이 아니라 buffer 라는 임시로 데이터를 보관하는 공간에 저장했다가 한 묶음씩 동작한다.
데이터를 한 묶음 단위로 동작하기 때문에 파일에 데이터를 쓸 때 os 레벨의 stystem call 횟수가 줄어들어서 성능이 증가한다.
Channel I/O
양방향 구조를 지원하기 위해 나온 개념이다. 기본적으로 buffer를 사용한다.
buffer API 를 사용해서 input 모드, output 모드로 변경하여 하나의 채널로 양방향(input, output)을 지원한다.
ByteStream
InputStream 과 OutputStream
데이터를 바이트 단위로 읽고 쓰기 위해 사용하는 클래스이다.
추상 클래스이며 어느 데이터 소스에 읽고 쓰느냐에 따라 다음과 같은 하위 클래스들이 있다. 아래에 정의된 거 말고도 많이 있다.
InputStream OutputStream Data Source
FileInputStream | FileOutputStream | 파일 |
ByteArrayInputStream | ByteArrayOutputStream | 메모리 |
SocketInputStream | SocketOutputStream | 네트워크 소켓 |
Character Stream
Reader 와 Writer
데이터를 문자 단위로 읽고 쓰기 위해 사용하는 클래스이다. 16bit 유니코드 문자를 주고 받는다.
추상 클래스이며 기능에 따라 다음과 같은 하위 클래스들이 있다.
Reader Writer Description
FileReader | FileWriter | 파일 입출력을 위한 문자 스트림 클래스 |
BufferedReader | BufferedWriter | 스트림에 버퍼 기능을 추가해줌 |
InputStreamReader | OutputStreamWriter | 바이트 단위를 문자 단위로 변환해줌 |
표준 스트림
System 클래스가 표준 입력장치로 입력받고 표준 출력장치로 출력하는 기능을 제공한다. 일반적으로는 표준 입력장치는 키보드, 표준 출력장치는 콘솔 화면이다.
System 클래스는 빌트인 패키지인 java.lang 에 포함되어 있어서 따로 import 를 하지 않아도 된다.
System.out, System.in, System.err static 클래스가 전언되어있고 이를 사용하여 표준 입출력이 가능하다.
public final class System {
...
public static final InputStream in = null;
public static final PrintStream out = null;
public static final PrintStream err = null;
...
}
ref