자바의 입출력 스트림
스트림 입출력이란?
스트림(Stream)이란 연속적인 데이터의 흐름 혹은 데이터를 전송하는 소프트웨어 모듈을 일컫습니다.
자바에서 입출력 스트림은 응용 프로그램과 입출력 장치를 연결하는 소프트웨어 모듈입니다. 입력 스트림은 키보드 장치를 제어하여 사용자의 키 입력을 받아 응용 프로그램에게 전달합니다. 또한, 응용 프로그램은 출력 스트림에 연결하고 출력 스트림에 출력하면, 출력 스트림인 다른 끝단에 연결된 출력 장치르 제어하여 출력을 완성합니다.

스트림 입출력 방식에서, 자바 응용 프로그램은 입출력 장치를 직접 제어하는 대신, 입출력 스트림 객체와 연결하여 쉽게 데이터 입출력을 실행합니다.
스트림의 양끝에는 입출력 장치와 자바 응용프로그램이 연결됩니다.
자바 응용프로그램은 입력 스트림과 출력 스트림만 연결하고, 입출력 스트림이 입출력 장치를 제어하고 실질적인 입출력을 담당합니다.
스트림은 단방향입니다.
입력 스트림은 입력 장치에서 응용 프로그램으로 데이터를 전송하며, 출력 스트림은 응용 프로그램으로부터 받은 데이터를 출력 장치로 전송합니다. 두 기능을 모두 가진 스트림은 없습니다.
스트림을 통해 흘러가는 기본 단위는 바이트나 문자입니다.
자바의 스트림 객체는 바이트를 단위로 입출력하는 바이트 스트림과 문자 단위로 입출력하는 문자 스트림으로 나뉩니다.
스트림은 선입선출, 증 FIFO 구조입니다.
입력 스트림에 먼저 들어온 데이터가 응용 프로그램에 먼저 전달되고, 출력 스트림은 응용 프로그램이 출력한 순서대로 출력 장치에 보냅니다.
바이트 스트림과 문자 스트림
자바에서 입출력 스트림은 문자 스트림(character stream)과 바이트 스트림(byte stream)의 2종류로 나뉩니다. 문자 스트림은 문자만 다루기 때문에, 문자가 아닌 데이터가 출력되면 보이지 않거나 엉뚱한 기호가 출력되며. 문자가 아닌 정보가 입력되면 응용 프로그램에게 엉뚠한 문자가 전달되는 오류가 발생합니다.
한편, 바이트 스트림은 바이트를 단위로 다루는 스트림으로, 스트림에 들어오고 나가는 정보를 단순 바이너리(비트들)로 다루기 때문에, 문자이든 이미지 바이트든 상관없이 흘려보냅니다.


응용 프로그램에서 바이트 단위나 문자 단위로 스트림 입출력을 할 수 있는 다양한 클래스들을 제공하며, 이들은 모두 java.io 패키지에 포함되어 있습니다. 바이트 스트림을 다루는 클래스는 공통적으로 이름 뒤에 Stream을 붙이고, 문자 스트림을 다루는 클래스는 Reader/Writer를 붙여 구분합니다.
스트림 연결
스트림은 서로 연결될 수 있습니다. 자바 응용 프로그램에서 바이트 스트림과 문자 스트림을 연결하여 사용해봅시다. 다음은 키보드로부터 문자를 입력받기 위해 표준 입출력 스트림인 System.in과 InputStreamReader 스트림 객체를 연결하는 코드입니다.
InputStreamReader rd = new InputStreamReader(System.in);
위 코드는 문자 스트림 rd를 생성하고, 키보드와 연결괸 표준 입력 스트림인 System.in을 연결합니다. System.in은 InputStream 타입으로 바이트 입력 스트림입니다. 이렇게 두 스트림이 연결되면, System.in은 사용자의 키 입력을 받아 바이트 스트림으로 내보내며, rd는 들어오는 바이트 스트림을 문자로 구성하여 응용 프로그램에게 전달합니다. 저버 응용프로그램은 다음과 같이 rd.read()를 통해 사용자가 입력한 문자를 읽을 수 있습니다.
int c = rd.read(); // 입력 스트림으로부터 키 입력. c는 입력된 키의 문자 값
연속적으로 들어오는 바이트들을 문자로 변환하고 문자를 응용프로그램에게 전달해줍니다.

'프로그래밍 언어 > JAVA' 카테고리의 다른 글
| 문자 집합과 InputStreamReader를 이용한 텍스트 파일 읽기 (1) | 2025.04.20 |
|---|---|
| FileReader (1) | 2025.04.17 |
| 제네릭 만들기 (0) | 2025.04.11 |
| LinkedList<E> & Collections 클래스 활용 (0) | 2025.04.08 |
| HashMap<K, V> (0) | 2025.04.05 |