본문 바로가기
Old Posts/Java

[Java] 입력 스트림(InputStream)과 출력 스트림(OutputStream) - java.io 패키지

by A6K 2021. 6. 25.

자바 프로그램은 외부에서 데이터를 읽거나 외부로 데이터를 쓰는 작업을 할 수 있다. 예를 들어 콘솔 입력을 받거나 모니터에 결과를 출력한다던가, 네트워크나 파일에서 데이터를 읽거나 쓰는 경우는 매우 흔하다. 이런 데이터의 입출력은 '스트림(Stream)'이라는 개념을 통해 수행된다. (Java8부터 도입된 스트림 기능과 혼동하지말자. 여기서 말하는 스트림은 입력 스트림(InputStream)과 출력 스트림(OutputStream)에 대한 내용이다)

1. 자바의 입출력 스트림(IOStream)

스트림(Stream)은 개울, 시내라는 명사와 '흐르다'라는 동사의 의미를 가지고 있는 단어다. 데이터의 입출력 관점에서보면 소스에서 타겟으로 데이터가 흘러가는 모양을 생각하면 편하다. 

소스(Source)에서 생성된 데이터는 타겟(Target)으로 흘러들어간다. 물이 상류에서 하류로 흘러가듯이 데이터 스트림은 소스에서 타겟으로 흘러간다. 즉, 방향성이 있다는 것이다. 키보드로 데이터를 입력하는 경우 소스는 키보드가 될 것이고 타겟은 입력을 받는 프로그램이 될 것이다. 파일을 열어서 데이터를 읽는다면 소스는 파일이 될 것이고 타겟은 파일 데이터를 읽는 프로그램이 될 것이다. 네트워크 통신이라면 소스와 타겟 모두 프로그램이 된다.

입력 스트림(InputStream)은 프로그램에서 데이터를 읽어 들이기 위한 스트림이다. 즉, 타겟이 현재 작성중인 프로그램인 스트림이다. 파일을 읽기 위한 스트림이 대표적이다. 출력 스트림(OutputStream)은 프로그램에서 데이터를 쓰기 위한 스트림이다. 즉, 소스가 현재 작성중인 프로그램인 스트림이다.

네트워크 프로그램의 경우 두 개의 프로그램이 데이터를 주고 받는다. 하나의 프로그램에서 다른 프로그램으로 데이터를 쓰는 경우 이 스트림은 소스프로그램에서는 OutputStream이고, 데이터를 받는 쪽에서는 InputStream이다.

2. java.io 패키지

자바는 기본적인 데이터의 입출력을 지원하기 위해 java.io 패키지를 제공한다. java.io 패키지에 구현되어 있는 클래스들을 이용해서 다양한 스트림 기반의 입출력을 실행할 수 있다.

java.io 패키지의 클래스 설명
Console 콘솔에서 문자를 입력받거나 콘솔로 출력하기 위한 클래스
File 파일 시스템의 파일 정보를 얻기 위한 클래스
InputStream / OutputStream 바이트 단위 입출력을 위한 클래스들의 최상위 클래스
FileInputStream / FileOutputStream 바이트 단위 입출력을 위한 하위 스트림 클래스들
DataInputStream / DataOutputStream
ObjectInputStream / ObjectOutputStream
PrintStream
BufferedInputStream / BufferedOutputStream
Reader / Writer 문자 단위 입출력을 위한 클래스들의 최상위 클래스
FileReader / FileWriter 문자 단위 입출력을 위한 하위 스트림 클래스들
InputStreamReader / OutputStreamWriter
PrintWriter
BufferedReader / BufferedWriter

java.io 패키지에는 대표적으로 문자 단위의 입출력 스트림 클래스들과 바이트 단위의 입출력 스트림 클래스들이 있다. 바이트 단위 입출력 스트림들은 주로 바이너리 데이터들을 다루며, 문자 단위 입출력 스트림들은 텍스트 단위의 입출력을 주로 다룬다.

2.1 InputStream, OutputStream

입력 스트림(InputStream)과 출력 스트림(OutputStream)은 바이트 기반의 입출력 스트림의 최상위 클래스다. 이 클래스들을 상속해서 구체적인 입출력 스트림 클래스들이 구현된다. 입력 스트림(InputStream)과 출력 스트림(OutputStream)을 상속받는 클래스는 다음 메소드를 구현해야한다.

클래스 메소드 설명
InputStream abstract int read() 입력 스트림으로부터 다음 바이트를 읽음
int read(byte[] b) 입력 스트림으로부터 특정 바이트를 읽고, 배열 b에 저장
int read(byte[] b, int off, int len) 입력 스트림으로부터 len 만큼 바이트를 읽고, b[off]부터 저장
OutputStream abstract void write(int b) 출력 스트림에 바이트를 저장
void write(byte[] b) 배열 b의 특정 바이트를 배열 b 길이만큼 출력 스트림에 저장
void write(byte[] b, int off, int len) b[off]부터 len 바이트만큼 출력 스트림에 저장

InputStream과 OutputStream 객체를 상속한 주요 클래스들은 다음과 같다.

입력 스트림 출력 스트림 입출력대상
FileInputStream FileOutputStream 파일
ByteArrayInputStream ByteArrayOutputStream 메모리
PipedInputStream PipedOutputStream 프로세스
BufferedInputStream BufferedOutputStream 버퍼를 이용한 입출력

이 밖에도 다양한 클래스들이 있다.

2.2 Reader, Writer

자바에서는 문자 기반의 스트림을 처리하기 위해 문자기반 스트림도 제공한다. Reader 클래스는 InputStream의 문자 기반 버전이고, Writer는 OutputStream의 문자기반 버전이다.

입력 스트림 출력 스트림 입출력 대상
FileReader FileWriter 파일
CharArrayReader CharArrayWriter 메모리
PipedReader PipedWriter 프로세스
StringReader StringWriter 문자열
BufferedReader BufferedWriter 버퍼를 이용한 입출력

 

댓글