Stream
실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름
- 자바에서는 파일, 시스템 입출력을 직접 다루지 않고 스트림이라는 흐름을 통해 다룹니다.
- 따라서 프로그램과 외부 시스템 사이의 중간 매개자라고 할 수 있습니다.
- 한 방향으로만 통신이 가능합니다. 따라서 입력 스트림과 출력 스트림으로 나눌 수 있습니다.
- java.io 패키지에서 입력 스트림과 출력 스트림 클래스를 별도로 제공합니다.

자바의 Stream
java.io 패키지에서 다양한 출력 스트림을 제공합니다.
크게 바이트 단위의 입출력 스트림과 문자 단위의 입출력 스트림으로 나눌 수 있습니다.
바이트 단위
문자, 그림, 영상 등 다양한 형태의 데이터를 주고 받습니다. 특징으로는 자바에서 소켓을 사용할 때 바이트 단위로 데이터를 주고 받습니다.
InputStream
- 외부에서 데이터를 읽는 역할을 수행
- 바이트 기반 입력 스트림의 최상위 추상 클래스
- Example
- 파일 데이터 읽기
- 네트워크 소켓을 통해 데이터를 읽기
- 키보드에서 입력한 데이터를 읽기
OutputStream
- 외부로 데이터를 출력하는 역할
- 바이트 기반 출력 스트림의 최상위 추상 클래스
문자 단위
오직 문자만 주고 받을 수 있습니다.
Reader
- 문자 기반 입력 스트림의 최상위 추상 클래스
- Example
BufferedReader
Writer
- 문자 기반 출력 스트림의 최상위 추상 클래스
Reference.
https://docs.oracle.com/javase/8/docs/api/
http://www.tcpschool.com/java/java_io_stream