29. 입출력 스트림


javalogo

Overview

자바에서의 입출력 스트림에 대해서 알아본다.


입출력 스트림이란?

영어 단어로 Stream이란 흐르는 시냇물을 뜻하며, 컴퓨터 공학에서 스트림은 연속적인 데이터 흐름 혹은 데이터를 전송하는 소프트웨어 모듈을 일컫는다.

컴퓨터의 스트림은 도착한 순서대로 데이터를 흘려보낸다.

스트림의 양 끝에는 프로그램과 장치가 연결된다.

자바의 입력 스트림은 키보드, 네트워크 등과 같은 입력 장치와 연결되고 다른 쪽에는 자바 프로그램이 연결되어, 입력 장치로부터 입력된 데이터가 프로그램으로 순서대로 흘러가게 한다.

자바의 출력 스트림은 자바 프로그램에서 출력되는 데이터를 디스플레이, 네트워크 장치, 프린터 등과 같은 출력 장치에 순서대로 흘려 보낸다.

스트림을 통해 흘러가는 데이터의 기본 단위는 바이트이다.

프로그램은 입력 스트림으로부터 받은 바이트들을 필요에 따라 문자로 바꾸어 인식하기도 하고, 4바이트를 조합하여 하나의 정수로 인식하기도 한다.

바이트 스트림을 해석하는 것은 프로그램에게 달려있다.

입출력 스트림의 특징

스트림은 단방향이다.

입력 스트림은 데이터가 입력 장치에서 자바 프로그램으로 들어가는 방향이며, 출력 스트림은 자바 프로그램에서 출력 장치로 데이터가 이동하는 방향이다.

스트림은 FIFO 구조이다.

입력스트림에 먼저 들어온 데이터가 프로그램에 먼저 전달되고, 출력 스트림은 자바 프로그램에서 출력한 순서대로 출력 장치에 보낸다.


바이트 스트림과 문자 스트림

자바에서는 응용프로그램의 입출력을 위해 여러 종류의 입출력 스트림 클래스를 제공한다.

다음 그림은 JDK에서 제공하는 자바의 입출력 스트림 클래스들의 계층 구조를 보여준다.

JDK에서 제공하는 자바의 입출력 스트림 클래스 계층구조 a JDK에서 제공하는 자바의 입출력 스트림 클래스 계층구조 b

이들은 모두 java.io 패키지에 포함되어 있다.

자바에서 스트림은 바이트 스트림문자 스트림의 2종류로 나뉜다.

위 그림의 (a)는 바이트 입출력을 다루는 문자 스트림 클래스들을, (b)는 문자 입출력을 다루는 문자 스트림 클래스들을 보여준다.

클래스 이름에 Stream이 들어 있으면 바이트 스트림을 처리하기 위한 클래스들이며, 클래스 이름에 Reader, Writer가 있으면 문자 스트림을 처리하는 클래스들이다.

바이트 스트림은 입출력되는 바이트의 binary 값을 있는 그대로 처리한다.

그러므로 스트림에 들어오는 데이터가 문자이든 단순 바이너리 정보이든 상관없이 처리할 수 있다.

그러나 문자 스트림은 오직 문자들을 다룬다.

문자 스트림은 문자가 아닌 바이트 정보가 들어오면 오류로 처리한다.

이미지나 오디오, 비디오 파일의 데이터는 문자가 아닌 단순 바이너리 정보들이므로, 이들 파일을 읽거나 쓰는 경우 문자 스트림 클래스(FileReader, FileWriter)는 적합하지 않다.

메모장으로 작성된 텍스트 파일이나 자바 소스 파일 같은 문자들로 이루어진 파일만 읽고 쓸 수 있다.

그러나 바이트 스트림 클래스(FileInputStream, FileOutputStream)는 두 경우 모두 읽고 쓸 수 있다.


스트림 연결

자바에서는 스트림이 서로 연결될 수 있다.

키보드로 부터 입력을 받기 위한 코드를 생각해보자.

InputStreamReader rd = new InputStreamReader(System.in);

이 코드는 다음과 같이 키보드와 연결된 System.in 스트림이 읽은 바이너리 데이터를 문자를 다루는 InputStreamReader 스트림에 연결시킨다.

키 입력 스트림에 문자스트림 연결

다음과 같이 InputStreamReader를 통해 읽으면 입력된 키의 문자 값을 읽을 수 있다.

int c = rd.read();  // 입력 스트림으로부터 키 입력. c는 입력된 키의 문자 값

예를 들어 위의 그림에서 사용자가 키보드로 ‘a’, ‘?’ 키를 순서대로 입력하면 표준 입력 스트림 System.in은 ‘a’와 ‘?’키를 읽고 바이트 정보를 내보낸다.

InputStreamReader는 이들 바이트를 문자로 변환하고 ‘a’, ‘?’ 문자를 응용프로그램에게 전달해준다.

스트림은 데이터 처리를 위하여 몇 개라도 연결이 가능하다.




© 2019. by RaP0d

Powered by aiden