데이터는 키보드를 통해 입력될 수도 있고, 파일 또는 프로그램으로부터 입력될 수도 있음. 반대로 데이터는 모니터로 출력될 수도 있고, 파일에 저장되거나 다른 프로그램으로 전송될 수 있음. 이것을 총칭해서 데이터 입출력이라고 함.
자바는 입력 스트림과 출력 스트림을 통해 데이터를 입출력함. 스트림은 단방향으로 데이터가 흐르는 것을 말하는데, 다음 그림과 같이 데이터는 출발지에서 나와 도착지로 흘러들어감.

프로그램을 기준으로 데이터가 들어오면 입력 스트림, 데이터가 나가면 출력 스트림이 됨. 프로그램이 다른 프로그램과 데이터를 교환하려면 양쪽 모두 입력 스트림과 출력 스트림이 필요함.

어떤 데이터를 입출력하느냐에 따라 스트림은 다음 두 종류로 구분할 수 있음.
자바는 데이터 입출력과 관련된 라이브러리를 java.io 패키지에서 제공하고 있음. java.io 패키지는 바이트 스트림과 문자 스트림을 다음과 같이 이름으로 구분해서 제공함.

바이트 입출력 스트림의 최상위 클래스는 InputStream과 OutputStream임. 이 클래스를 상속 받는 자식 클래스에는 접미사로 InputStream 또는 OutputStream이 붙음. 예를 들어 이미지와 같은 바이너리 파일의 입출력 스트림 클래스는 FileInputStream과 FileOutputStream임.
문자 입출력 스트림의 최상위 클래스는 Reader와 Writer임. 이 클래스를 상속받는 하위 클래스에는 접미사로 Reader 또는 Writer가 붙음. 예를 들어 텍스트 파일의 입출력 스트림 클래스는 FileReader와 FileWriter임.

OutputStream은 바이트 출력 스트림의 최상위 클래스로 추상 클래스임. 모든 바이트 출력 스트림 클래스는 이 OutputStream 클래스를 상속받아서 만들어짐.

OutputStream 클래스에는 모든 바이트 출력 스트림이 기본적으로 가져야 할 메소드가 정의되어 있음. 다음은 OutputStream 클래스의 주요 메소드임.
