java.io 패키지에는 여러 가지 종류의 스트림 클래스를 제공하고 있습니다. 이들 스트림 클래스는 다음과 같이 크게 두 종류로 구분됩니다.
- 바이트 기반 스트림: 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용
- 문자(character) 기반 스트림: 문자 데이터를 읽고 출력할 때 사용
스트림 클래스가 바이트 기반인지, 문자 기반인지를 구별하려면 최상위 클래스를 보면 됩니다.
구분 | 바이트 기반 스트림 | 문자 기반 스트림 | ||
입력 스트림 | 출력 스트림 | 입력 스트림 | 출력 스트림 | |
최상위 클래스 | InputStream | OutputStream | Reader | Writer |
하위 클래스 (예) |
XXXInputStream (FileInputStream) |
XXXOutputStream (FileOutputStream) |
XXXReader (FileReader) |
XXXWriter (FileWriter) |
1. 바이트 출력 스트림 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() | 출력 스트림을 닫음 |
1-1. write(int b) 메소드
write(int b) 메소드는 매개 변수로 주어지는 int(4byte)에서 끝 1 btye만 출력 스트림으로 보냅니다. 매개 변수가 int 타입이므로 4byte 모두를 보내는 것은 아닙니다.
package sec06.exam06;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class Hello {
public static void main(String[] args) throws Exception {
OutputStream os = new FileOutputStream("test1.db");
byte a = 10;
byte b = 20;
byte c = 30;
os.write(a);
os.write(b);
os.write(c);
os.flush();
os.close();
}
}
결과: test1.db
write() 메소드로 1byte씩 세 번 출력합니다. 그 다음 flush() 메소드를 통해 잔류 바이트를 모두 출력합니다. 출력 스트림은 출력할 바이트를 바로 보내는 것이 아니라 내부 버퍼(저장소)에 우선 저장해놓습니다.
1-2. 바이트 입력 스트림 InputStream - 추상 클래스
주요 메소드
리턴 타입 | 메소드 | 설명 |
int | read() | 1byte를 읽고 읽은 바이트를 리턴, 읽을 바이트가 없으면 -1 리턴 |
int | read(byte[] b) | 읽은 바이트를 매개값으로 주여진 배열에 저장하고 읽은 바이트 수를 리턴. 읽을 바이트가 없으면 -1 리턴 |
int | read(byte [] b. int off, int len) | len개의 바이트를 읽고 매개값으로 주어진 배열에서 b[off]부터 len개까지 저장. 그리고 읽은 바이트 수를 리턴. 읽을 바이트가 없으면 -1 리턴 |
void | close() | 입력 스트림을 닫음 |
2-1. read() 메소드
read() 메소드는 입력 스트림으로부터 1 byte를 읽고 int 타입으로 리턴합니다. 따라서 리턴된 4byte 중 끝 1byte에만 데이터가 들어 있습니다. 예를 들어 입력 스트림에서 5개의 바이트가 들어온다면 rea() 메소드로 1byte씩 5번 읽을 수 있습니다.
더 이상 입력 스트림으로부터 바이트를 읽을 수 없다면 read() 메소드는 -1을 리턴하는데, 이것을 이용하면 읽을 수 있는 마지막 바이트까지 반복해서 1바이트씩 얻을 수 있습니다.
입력 스트림을 생성하여 위에서 만든 test1.db 파일을 읽어보겠습니다.
결과:
10
20
30
많은 양의 바이트를 읽을 때는 read(byte[] b)가 좋습니다.
3. 문자 출력 스트림 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() | 출력 스트림을 닫음 |
3-1. write(int c) 메소드
write(int c) 메소드는 매개 변수로 주어지는 int에서 긑 2byte(1개의 문자)만 출력 스트림으로 보냅니다.
4. 문자 입력 스트림 Reader - 추상 클래스
주요 메소드
리턴 타입 | 메소드 | 설명 |
int | read() | 1개의 문자를 읽고 리턴. 더 이상 읽은 문자가 없으면 -1 리턴 |
int | read(char[] cbuf) | 읽은 문자들을 매개값으로 주어진 문자 배열에 저장하고 읽은 문자 수를 리턴. 더 이상 읽은 문자가 없으면 -1 리턴 |
int | read(char[] cbud, int off, int len) | len개의 문자를 읽고 매개값으로 주어진 문자 배열에서 cbuf[off]부터 len개 저장. 읽은 문자 수 리턴. 더 이상 읽은 문자가 없으면 -1 리턴 |
void | close() | 입력 스트림 닫음 |
결과:
Hello World
'java' 카테고리의 다른 글
입출력 관련 API (0) | 2021.02.01 |
---|---|
보조 스트림 (0) | 2021.02.01 |
java 스택, 큐 (0) | 2021.01.30 |
java 컬렉션 프레임워크 (0) | 2021.01.29 |
스레드 제어 (0) | 2021.01.29 |