목차
14-1 / 입출력 스트림
프로그램은 데이터를 읽고 출력하는 작업을 빈번하게 수행한다. 이런 수행에 있어 데이터를 읽고 출력하기 위해 사용되는 입출력 API에 대해 알아본다.
- 스트림이란?
단일 방향으로 연속적으로 흘러가는 것을 말하는데 자바에서는 데이터는 스트림(stream)을 통해 입출력된다.
데이터가 출발지에서 도착지로 흘러간다.

- 프로그램이 출발지면 데이터를 출력하므로 출력 스트림을 사용
- 프로그램이 도착지면 데이터를 입력받아야하므로 입력 스트림을 사용
입출력 스트림의 종류
- java.io 패키지에서 제공하는 스트림 클래스들을 크게 두 종류로 구분 (구분 방법은 접미사)
- 바이트(byte) 기반 스트림 : 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력 할 때 사용
- 문자(character) 기반 스트림 : 문자 데이터를 읽고 출력할 때 사용
구분 | 바이트 기반 스트림 | 문자 기반 스트림 | ||
입력 스트림 | 출력 스트림 | 입력 스트림 | 출력 스트림 | |
최상위 클래스 | InputStream | OutputStream | Reader | Writer |
하위 클래스 | XXXInputStream | XXXOutputStream | XXXReader | XXXWriter |
바이트 출력 스트림 : OutputStream
모든 바이트 기반 출력 스트림 클래스가 OutputStream 클래스를 상속받아 만들어진다.

- OutputStream 클래스의 주요 메소드
리턴 타입 | 메소드 | 설명 |
void | write(int b) | 1byte를 출력 |
void | write(byte[] b) | 매개값으로 주어진 배열 b의 모든 바이트 출력 |
void | write(byte[] b, int off, int len) | 매개값으로 주어진 배열 b[off] 부터 len개까지의 바이트 출력 |
void | flush() | 출력 버퍼에 잔류하는 모든 바이트 출력 |
void | close() | 출력 스트림 닫기 |
- write(int b)
이 메소드는 매개변수로 주어지는 int(4byte)에서 끝의 1byte만 출력 스트림 보낸다.

- write(byte[] b)
매개값으로 주어진 배열 모든 바이트를 출력 스트림으로 보낸다

- write(byte[] b, int off, int len)
매개값으로 주어진 배열b의 off 인덱스부터 len개의 바이트를 출력 스트림으로 보낸다

바이트 입력 스트림 : InputStream
모든 바이트 기반 입력 스트림 클래스가 InputStream 클래스를 상속받아 만들어진다.

- InputStream 클래스의 주요 메소드
리턴 타입 | 메소드 | 설명 |
int | read() | 1byte를 읽고 읽은 바이트 리턴 |
int | read(byte[] b) | 읽은 바이트를 매개값으로 주어진 배열에 저장하고 읽은 바이트 수를 리턴 |
int | read(byte[] b, int off, int len) | len개의 바이트를 읽고 매개값으로 주어진 배열b의 off 인덱스부터 len개 까지 저장하며 읽은 바이트 수를 리턴한다. |
void | close() | 입력 스트림을 닫기 |
- read()
입력 스트림으로 부터 1byte씩을 읽어내 int(4byte) 타입으로 리턴하여 리턴된 int값엔 마지막 byte에만 데이터가 있다.
입력 스트림이 5개 byte가 들어오면 1byte씩 5번 읽는다. 더 이상 바이트를 읽을 수 없다면 -1을 리턴한다.

- read(byte[] b)
매개값으로 주어진 배열 길이 만큼 byte를 읽고 해당 배열 저장한다. 실제로 읽은 byte수가 배열 길이보다 적다면 읽은 수만큼만 리턴한다. 그리고 최종적으로 더이상 byte를 읽어낼 수 없다면 -1를 리턴한다.

- read(byte[] b, int off, int len)
입력 스트림으로 부터 len개 byte만큼 읽고 매개갑승로 주어진 byte 배열b의 off 인덱스부터 len개 까지 저장한다. 그리고 읽은 byte수인 len개를 리턴한다. 실제로 읽은 byte수가 배열 길이보다 적다면 읽은 수만큼만 리턴한다. 바이트를 읽을 수 없다면 -1을 리턴한다.

문자 출력 스트림 : Writer
모든 문자 기반 출력 스트림 클래스가 Writer 클래스를 상속받아 만들어진다.

- Writer클래스의 주요 메소드
리턴 타입 | 메소드 | 설명 |
void | write(int c) | 매개값으로 주어진 한 문자를 보낸다 |
void | write(char[] cbuf) | 매개값으로 주어진 배열의 모든 문자를 보낸다 |
void | write(char[] cbuf, int off, int len) | 매개값으로 주어진 배열 cbuf의 off 인덱스부터 len개까지 문자를 보낸다 |
void | write(String str) | 매개값으로 주어진 문자열을 보낸다 |
void | write(String str, int off, int len) | 매개값으로 주어진 문자열에서 off순번부터 len개까지의 문자를 보낸다 |
void | flush() | 버퍼에 잔류하는 모든 문자를 출력 |
void | close() | 출력 스트림을 닫기 |
- write(int c)
매개 변수로 주어지는 int에서 끝에 2byte(1개 문자값)만 출력 스트림으로 보낸다.

- write(char[] cbuf)
매개값으로 주어진 char[] 배열의 모든 문자를 출력 스트림으로 보낸다

- write(char[] cbuf, int off, int len)
매개값으로 주어진 cbuf의 off 인덱스부터 len개의 문자를 출력 스트림으로 보낸다

- write(String str)와 write(String str, int off, int len)
문자열을 쉽게 보내기 위해서 두 메소드를 제공한다.
- write(String str)는 문자열 전체를 출력 스트림으로 보냄
- write(String str, int off, int len)는 주어진 문자열 str에서 off순번부터 len개까지 출력 스트림으로 보냄

문자 입력 스트림 : Reader
모든 문자 기반 입력 스트림 클래스가 Reader 클래스를 상속받아 만들어진다.

- Reader 클래스의 주요 메소드
리턴 타입 | 메소드 | 설명 |
int | read() | 1개의 문자를 읽고 리턴 |
int | read(char[] cbuf) | 읽은 문자들을 매개값으로 주어진 문자 배열에 저장하고 읽은 문자수 리턴 |
int | read(char[] cbuf, int off, int len) | len개의 문자를 읽고 매개값으로 주어진 문자 배열 cbuf의 off 인덱스부터 len개까지 저장. 그리고 읽은 문자 수 리턴 |
void | close() | 입력 스트림 닫기 |
- read()
입력 스트림으로 부터 1개의 문자 (2byte)를 읽고 int(4byte)로 반환한다. 리턴된 4byte중 끝에 2byte만 문자 데이터가 들어가 있다. 더이상 입력 스트림으로 부터 문자를 읽을 수 없다면 -1을 리턴한다.
또한 read()가 리턴한 int값을 char로 변환하면 읽은 문자를 얻을 수 있다.

- read(char[] cbuf)
입력 스트림으로 부터 매개값으로 주어진 문자 배열의 길이만큼 문자를 읽고 배열에 저장한다. 그리고 읽은 문자 수를 리턴한다. 실제로 문자 수가 배열의 길이보다 적을 경우 읽은 수 만큼 리턴한다. 더 이상 입력 스트림에서 문자를 읽을 수 없다면 -1을 리턴한다.

- read(char[] cbuf, int off, int len)
입력 스트림으로부터 len개의 문자 만큼 읽고 매개값으로 주어진 문자 배열 cbuf의 off 인덱스부터 len개까지 저장한다. 그리고 읽은 문자 수인 len개를 리턴한다. 입력 스트림으로부터 문자를 더이상 읽을 수 없다면 -1을 리턴한다.

'Programming > Java' 카테고리의 다른 글
혼공자바] 13-2 LIFO와 FIFO 컬렉션 (0) | 2022.12.27 |
---|---|
혼공자바] 13-1 컬렉션 프레임 (1) | 2022.12.27 |
혼공자바] 12-2 스레드 제어 (0) | 2022.12.19 |
혼공자바] 12-1 멀티 스레드 (1) | 2022.12.15 |
혼공자바] 11 기본 API 클래스 (0) | 2022.12.14 |