[자바/안드로이드] 입출력 스트림

Posted by 앱해피
2015. 6. 22. 00:22 자바(JAVA)

 

 

 

 

스트림(Stream) 이란 무엇인가?

 

컴퓨터 공학에서 스트림이란 데이터의 흐름을 의미한다.

 

입력 스트림은 키보드, 마우스, 네트워크 등과 같은 입력 장치로부터 입력된 데이터가 순서대로

프로그램으로 흘러가는 데이터의 흐름을 뜻한다.

 

출력 스트림은 프로그램에서 출력된 데이터가 프린터, 모니터, 네트워크 등과 같은 출력 장치로

순서대로 전송되도록 보장하는 데이터의 흐름이다.

 

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

 

 

 

스트림(Stream)의 특징

 

1. 스트림은 단방향이다.

 

방향에 따라 입력 스트림과 출력 스트림으로 나뉜다. 방향에 따라 입력, 출력 스트림으로 나뉜다.

 

2. 스트림은 선입선출, 즉 FIFO 구조이다.

 

즉, 먼저 들어간 데이터가 먼저 나온다.

 

3. 스트림은 연결될 수 있다.

 

ex) InputStreamReader rd = new InputStreamReader(System.in);

 

System.in이 표준 입력 스트림을 통해서 바이트 데이터를 전달하면

 

InputStreamReader 스트림에서 전달되는 바이트 데이터를 문자 값으로 변환한다.

 

 

 

4. 스트림은 지연될 수 있다.

 

입력 스트림이 비어 있다면, 프로그램은 읽어갈 데이터가 없으므로 스트림에 데이터가

도착할 때까지 기다린다. 

 

출력 스트림에 데이터가 꽉차 있는 경우, 프로그램은 더 이상 출력할 수 없기 때문에

빈 공간이 생길 때까지 기다린다.

 

 

 

5. 스트림은 바이트 스트림과 문자 스트림으로 나눌 수 있다.

 

자바에서 스트림의 종류에는 1)바이트 스트림2)문자 스트림이 있다.

 

 

 

 

대표적인 바이트 스트림(Byte Stream)

 

바이트 스트림은 8비트의 바이트 단위로 데이터가 흐르는 스트림이다.

 

바이트 스트림을 다루는 모든 자바 클래스는 InputStream과 OutputStream의 서브 클래스이다.

 

바이트 스트림은 데이터에 어떠한 가공을 하지 않으므로 텍스트 파일뿐만 아니라

 

이미지나 동영상과 같은 바이너리 데이터를 입출력하는 데 적합하다.

 

InputStream / OutputStream

 

이 클래스는 추상 클래스로서 바이트 스트림을 기능을 갖는 모든 클래스의 슈퍼(상위) 클래스다.

 

FileInputStream / FileOutputStream

 

이 스트림을 이용해서 파일 시스템에 있는 파일로부터 바이트 데이터를 읽거나 파일에 바이트 데이터를 저장할 수 있다.

 

즉, 파일 입출력용 스트림이다. 바이트 스트림이므로 바이너리 데이터를 파일로부터 읽거나 그대로 파일에 저장하는 기능을 한다.

 

DataInputStream / DataOutputStream

 

이 스트림을 이용하면 자바의 기본 데이터 타입인 boolean, char, byte, short, int, long, float, 그리고 Double 타입의 바이너리 값(이진수)이나 문자열(String)을 바로 입출력할 수 있다. 즉, 자바 기본 타입의 데이터들이 바이너리 바이트(이진값)으로 다루어진다.

 

대표적인 문자 스트림

 

문자 스트림은 유니코드로 된 문자 단위의 데이터가 흐르는 스트림이다.

 

문자화되지 못하는 바이너리 값들은 이 스트림에 존재할 수 없다.

그렇기 때문에 문자 스트림을 통해서 바이너리 파일을 읽을 수는 없다.

 

자바에서 문자 스트림을 다루는 모든 클래스Reader와 Writer 클래스의

서브 클래스이며, 클래스 이름에 Reader, Writer를 포함하고 있다.

 

문자 스트림을 다루는 클래스는 데이터를 로컬 문자 집합으로 자동 변환하기 때문에,

문자 스트림 클래스는 문자로 인식되는 데이터, 즉 텍스트 혹은 텍스트 파일만 처리 가능.

 

그러므로 한글과 같은 문자 집합은 2바이트의 유니코드이므로 문자 스트림으로 처리해야 한다.

 

Reader / Writer

 

Reader와 Writer 클래스는 추상 클래스로서 문자 입출력 스트림을 다루는 모든 클래스의

슈퍼클래스이다.

 

InputStreamReader / OutputStreamWriter

 

이 두 클래스는 바이트 스트림과 문자 스트림을 연결시켜주는 다리 역할을 한다. 이 두 클래스는 지정된 문자 집합을 이용한다. InputStreamReader는 바이트들을 읽어 지정된 문자 집합 내의 문자로 인코딩하며, OutputStreamWriter는 출력 스트림에서 문자를 바이트들로 디코딩하여 출력 스트림으로 출력한다.

 

FileReader / FileWriter

 

텍스트 파일로 문자 데이터를 입출력한다. 각각 FileInputStream과 FileOutputStream을 이용해서

바이트 스트림을 문자 스트림으로 변환한다.