Java - Stream

inputStream, outputStream의 그 stream이 무엇인지 알아보자

Posted by Yan on April 12, 2021

Stream

  1. 흐르는 시냇물 본래 영단어의 뜻은 흐르는 시냇물이라고 한다. 넓게 보아 ‘흐름’을 의미한다고 보면 될 것 같다.
  2. 데이터의 흐름 컴퓨터 용어로 stream이란, 데이터, 패킷, 비트 등 일련의 연속성을 갖는 흐름을 의미한다고 한다.
  • 음성, 영상, 텍스트 등이 작은 데이터 조각으로 하나의 줄기를 이루면서, 순서대로 물 흐르듯 전송되는 데이터 열을 의미한다.
예시 ) 동영상 및 음원 스트리밍 Streaming
  • ‘흘리다’라는 뜻의 streaming.
  • 소리나 동영상 멀티미디어 파일을 전송하고 재생하는 방식의 하나가 스트리밍이다.
  • 동영상 전체를 다운 받고 재생하려면 시간이 걸린다. 크기가 크기 때문에 미디어를 저장하고 전달하는 비용이 크다. 그 비용을 줄일 수 있는 것이 스트리밍이다. 스트리밍은 점진적으로 다운로드하면서 재생하는 방식이다. 저장하면서 압축을 할 수 있다.
  • 스트리밍을 이용해 라이브 방송을 할 수 있다.

Stream의 기본 단위 Byte

  • 프로그램은 입력 스트림에게서 받은 바이트들을 문자로 해석하거나, 4byte씩 끊어서 정수로 인식하는 등 다양하게 해석할 수 있다.

입력 스트림

  • 키보드, 마우스, 네트워크 등과 같은 입력장치에서 입력된 데이터가 순서대로 프로그램에 흘러가는 데이터의 흐름 또는 소프트웨어 장치를 말한다.
  • 데이터가 입력장치 -> 프로그램 으로 이동하는 방향

출력 스트림

  • 프로그램에서 출력된 데이터가 프린터, 콘솔, LCD, 네트워크 등과 같은 출력 장치에 순서대로 전송되도록 하는 데이터의 흐름 또는 소프트웨어 장치를 말한다.
  • 프로그램 -> 출력장치 로 데이터가 이동하는 방향

자바 코드 예시

1
InputStreamReader reader = new InputStreamReader(System.in);
  • System.in : 표준 입력 스트림을 발생시키는 장치 (문자를 바이트 정보로 인식)
  • InputStreamReader : System.in에 의해서 리턴되는 스트림 데이터를 문자 스트림으로 변환 (바이트 정보를 문자로 인식)
  • InputStreamReader로 데이터를 읽으면 입력된 순서로 문자 값을 해석하여 읽을 수 있다.
  • 스트림은 데이터 처리를 위해 여러 개 연결 가능

스트림의 특징

  • 분류 : 바이트 스트림 & 문자 스트림
  • 스트림은 지연될 수 있다.
    • 만약 출력 스트림에 데이터가 꽉 차 있다면, 프로그램은 더 이상 출력을 할 수 없어 빈공간이 생길 때까지 기다려야 한다.

자바의 InputStream, OutputStream

  • Java.io 패키지 : 자바는 응용 프로그램이 입출력 스트림을 생성하여 입출력을 수행할 수 있도록 입출력 스트림을 위한 클래스를 제공한다.
  • InputStream : 바이트 기반 입력 스트림의 최상위 클래스. 추상클래스이다.
  • OutputStream : 바이트 기반 출력 스트림의 최상위 클래스. 추상클래스이다.
inputStream 클래스 예시
  • java.io.InputStream (implements java.io.Closeable)
    • java.io.ByteArrayInputStream
    • java.io.FileInputStream
    • java.io.FilterInputStream
      • java.io.BufferedInputStream
      • java.io.DataInputStream (implements java.io.DataInput)
      • java.io.LineNumberInputStream
      • java.io.PushbackInputStream
    • java.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants)
    • java.io.PipedInputStream
    • java.io.SequenceInputStream
    • java.io.StringBufferInputStream
Java.io 패키지의 주요 클래스 설명
File 파일 시스템의 파일 정보를 얻기 위한 클래스
Console 콘솔로부터 문자를 입출력하기 위한 클래스
InputStream OutputStream 바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileInputStream FileOutputStream 바이트 단위 입출력을 위한 하위 스트림 클래스
DataInputStream DataOutputStream 바이트 단위 입출력을 위한 하위 스트림 클래스
ObjectInputStream ObjectOutputStream 바이트 단위 입출력을 위한 하위 스트림 클래스
PrintStream 바이트 단위 입출력을 위한 하위 스트림 클래스
BufferedInputStream BufferedOutputStream 바이트 단위 입출력을 위한 하위 스트림 클래스
Reader Writer 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileReader FileWriter 문자 단위 입출력을 위한 하위 스트림 클래스
InputStreamReader OutputStreamWriter 문자 단위 입출력을 위한 하위 스트림 클래스
PrinterWriter 문자 단위 입출력을 위한 하위 스트림 클래스
BufferedReader BufferedWriter 문자 단위 입출력을 위한 하위 스트림 클래스

InputStream 메소드

InputStream 메소드 설명
int available() 현재 읽을 수 있는 바이트 수를 반환한다
void close() 현재 열려있는 InputStream을 닫는다
void mark(int readlimit) InputStream에서 현재의 위치를 표시해준다
boolean markSupported() 해당 InputStream에서 mark()로 지정된 지점이 있는지에 대한 여부를 확인한다
abstract int read() InputStream에서 한 바이트를 읽어서 int값으로 반환한다
int read(byte[] b) byte[] b 만큼의 데이터를 읽어서 b에 저장하고 읽은 바이트 수를 반환한다
int read(byte[] b, int off, int len) len만큼 읽어서 byte[] b의 off위치에 저장하고 읽은 바이트 수를 반환한다
void reset() mark()를 마지막으로 호출한 위치로 이동
long skip(long n) InputStream에서 n바이트만큼 데이터를 스킵하고 바이트 수를 반환한다

OutputStream 메소드

OutputStream 메소드 설명
void close() OutputStream을 닫는다
void flush() 버퍼에 남아있는 출력 스트림을 출력한다
void write(byte[] b) 버퍼의 내용을 출력한다
void write(byte[] b, int off, int len) b배열 안에 있는 시작 off부터 len만큼 출력한다
abstract void write(int b) 정수 b의 하위 1바이트를 출력한다

참고자료