http://java.sun.com/docs/books/tutorial/essential/io/streams.html
위 글을 보면서 정리합니다.

Input/Output 스트림은 입/출력의 대상이 되는 소스와 그 대상을 가리키는 말입니다. 위 글에 있던 그림을 보면 이해가 빠를 것 같습니다.

Reading information into a program.

Input Stream은 Data를 프로그램으로 읽어들여오는데(Read) 사용하며 그 모습을 보여주는 그림입니다.

Writing information from a program.

Output Stream은 Data를 프로그램 밖으로 빼는데(Write) 사용하며 그 모습을 보여주는 그림입니다.

스트림(Stream)을 두 종류로 나눌 수 있는데 하나는 바이트 스트림(Byte Stream)이고 다른 하나는 문자 스트림(Character Stream)입니다.

바이트 스트림은 한 번에 8bit 씩 처리하는 스트림이고 InputStream ClassOutputStream Class의 하위 클래스들이 모두 바이트 스트림입니다.

InputStream 하위 클래스 보기
[#M_ more.. | less.. |
AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream
_M#]
이곳에 가시면 FileInputStream 과 FileOutputStream을 사용한 Copy 기능을 하는 소스를 볼 수 있습니다.

문자 스트림은 한 번에 16bit(2byte) 씩 처리하는 스트림이고 Reader ClassWriter Class의 하위 클래스들이 모두 문자 스트림입니다.

Reader 하위 클래스 보기
[#M_ more.. | less.. |
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
_M#]
이곳에 가시면 FileReader와 FileWriter를 사용하여 Copy 기능을 하는 소스를 볼 수 있습니다.

세가지 분류가 있습니다.
데이타 소스 인가 데스티네이션인가?
바이트 스트림인가 문자 스트림인가?
노드 스트림인가 필터 스트림인가?