본문 바로가기

자바

자바 I/O

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

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

자바 람다식  (1) 2024.09.18
자바 제네릭  (0) 2024.08.21
자바 애노테이션 프로세서  (1) 2024.04.12
자바 애노테이션  (0) 2024.04.03
Enum  (2) 2024.03.15