본문 바로가기

java

java 입출력 스트림

 

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