데이터는 키보드, 파일 또는 네트워크로부터 입력될 수 있고 모니터, 파일 또는 네트워크로 출력 될 수 있다.
스트림
- 입출력 장치에 데이터를 읽고 쓰기 위해서 제공하는 클래스
- 데이터 흐름
- 자바에선 스트림을 통해 입출력이 된다
- 입력 스트림/출력 스트림 따로 만들어야됨
- 다양한 장치로부터 데이터 입출력에 대해 동일한 처리 방법 제공
- 모든 스트림은 단방향이며 각각의 장치마다 연결할 수 있는 스트림이 존재
- 프로그램 기준 입
- 바이트 기반 입력 스트림의 최상위 클래스
- 추상 클래스
- 그림, 멀티 미디어, 문자 등 모든 데이터 입력 받을 수 있음
- InputStream을 상속받는 클래스들은 접미사로 InputStream이 붙는다
| 최상위 클래스 | 하위 클래스 |
|---|
| InputStream | FileInputStream |
| InputStream | PipedInputStream |
| InputStream | DataInputStream |
| InputStream | BufferedInputStream |
| InputStream | StringBufferedInputStream |
| InputStream | ObjectInputStream |
- 외부 장치로부터 바이트 단위의 데이터를 읽어 올 수 있는 read() 추상 메소드
| 리턴 타입 | 메소드 |
|---|
| int | read() |
| int | read(byte[] b) |
| int | read(byte[] b, int off, int len) |
| void | close() |
- 사용한 시스템 자원 반납 후 입력 스트림을 닫는 close() 추상 메소드가 정의
OutputSteam
- 바이트 기반 출력 스트림의 최상위 클래스
- 추상 클래스
- 그림, 멀티미디어, 문자 등 모든 데이터 출력 가능
- OutputStream을 상속받는 클래스들은 접미사로 OutputStream이 붙는
- OutputStream을 상속받는 클래스들은 접미사로 OutputStream이 붙는다.
| 최상위 클래스 | 하위 클래스 |
|---|
| OutputStream | FileOutputStream |
| OutputStream | PipedOutputStream |
| OutputStream | DataOutputStream |
| OutputStream | BufferedOutputStream |
| OutputStream | PrintStream |
| OutputStream | ObjectOutputStream |
- 바이트 단위의 데이터를 외부 장치에 기록할 수 있는 write() 추상 메소드가 정의되어 있다.
| 리턴 타입 | 메소드 |
|---|
| void | write(int b) |
| void | write(byte[] b) |
| void | write(byte[] b, int off, int len) |
- 버퍼에 잔류하는 모든 바이트를 출력하는 flush() 추상 메소드가 정의되어 있다.
- 사용한 시스템 자원 반납 후 출력 스트림을 닫는 close() 추상 메소드가 정의되어 있다.
Reader
- 문자 기반 입력 스트림의 최상위 클래스
- 추상위 클래스
- 문자는 2바이트
- 문자 데이터만 입력받을 수 있음
- Reader 상속받는 클래스들은 접미사로 Reader가 붙는다
| 최상위 클래스 | 하위 클래스 |
|---|
| Reader | BufferedReader |
| Reader | CharArrayReader |
| Reader | InputStreamReader |
| Reader | FileReader |
| Reader | PipedReader |
| Reader | StringReader |
- 외부 장치로부터 문자 단위의 데이터를 읽어 올 수 있는 read() 추상 메소드가 정의되어 있다.
| 리턴 타입 | 메소드 |
|---|
| int | read() |
| int | read(char[] c) |
| int | read(char[] c, int off, int len) |
| void | close() |
- 사용한 시스템 자원 반납 후 입력 스트림을 닫는 close() 추상 메소드가 정의되어 있다.
Writer
- 문자 기반 출력 스트림의 최상위 클래스
- 추상클래스
- 문자데이터만 출력 가능
- Writer를 상속받는 클래스들은 접미사로 Writer가 붙는다.
| 최상위 클래스 | 하위 클래스 |
|---|
| Writer | BufferedWriter |
| Writer | CharArrayWriter |
| Writer | OutputStreamWriter |
| Writer | FileWriter |
| Writer | PipedWriter |
| Writer | StringWriter |
- 문자 단위의 데이터를 외부 장치에 기록할 수 있는 write() 추상 메소드가 정의되어 있다.
| 리턴 타입 | 메소드 |
|---|
| void | write(int c) |
| void | write(char[] c) |
| void | write(char[] c, int off, int len) |
| void | write(String str) |
| void | write(String str, int off, int len) |
- 버퍼에 잔류하는 모든 문자열을 출력하는 flush() 추상 메소드가 정의되어 있다.
- 사용한 시스템 자원 반납 후 출력 스트림을 닫는 close() 추상 메소드가 정의되어 있다.
File Class
- 파일 크기, 속성, 이름 등의 정보를 얻어내는 기능과 파일 생성 및 삭제하는 기능을 제공
- 파일의 데이터를 읽고 쓰는 기능은 지원하지 않는다
- 파일의 데이터를 읽고 쓰기 위해서는 파일 관련 입출력 스트림 사용해야 한다
파일 관련 입출력 스트림
- InputStream의 하위 클래스
- 파일로부터 바이트 단위로 데이터를 입력받는 클래스
- 그림, 오디오, 지디오, 텍스트 파일 등 모든 종류의 파일 읽기 가능
FileInputStream fis = new FileInputStream("C:/data/test.txt");
FileOutputStream
- OutputStream의 하위 클래스
- 바이트 단위로 데이터를 파일에 출력하는 클래스
- 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일로 저장이 가능
FileOutputStream fos = new FileOutputStream("C:/data/test.txt");
FileOutputStream fos = new FileOutputStream("C:/data/test.txt", true);
FileReader
- Reader의 하위 클래스
- 텍스트 파일로부터 문자 단위로 데이터를 입력받는 클래스
- 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽기가 불가능
FileReader fr = new FileReader("C:/data/test.txt");
FileWriter
- Writer의 하위 클래스
- 문자 단위로 데이터를 텍스트 파일에 출력하는 클래스
- 텍스트가 아닌 그림, 오디오, 비디오 등의 파일에 저장이 불가능
FileWriter fw = new FileWriter("C:/data/test.txt");
FileWriter fw = new FileWriter("C:/data/test.txt", true);
보조스트림
- 보조 스트림은 기반 스트림(InputStream, OutputStream, Reader, Writer)의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용한다.
- 보조 스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 입출력 처리 불가능하다.
- 보조 스트림은 반드시 기반 스트림(InputStream, OutputStream, Reader, Writer)을 먼저 생성한 후 이를 이용하여 보조 스트림 생성해야 한다.
문자 변환 보조 스트림
- 기반 스트림이 바이트 기반 스트림이지만 데이터가 문자일 경우에 사용한다.
- InputStreamReader는 바이트 기반의 InputStream에 연결되어 문자 기반의 Reader로 변환하는 보조 스트림이다.
- OutputStreamWriter는 바이트 기반의 OutputStream에 연결되어 문자 기반의 Writer로 변환하는 보조 스트림이다.
성능 향상 보조 스트림
- 입출력 성능에 영향을 미치는 입출력 장치(하드디스크, 네트워크 등)를 이용하는 경우에 사용
- 입출력 장치(하드디스크, 네트워크 등)와 직접 작업하지 않고 버퍼에 데이터를 모아 한 번에 입출력 작업을 하여 성능을 향상한다.
- BufferedInputStream(BufferedReader)은 외부의 입력 장치로부터 데이터를 직접 읽지 않고 버퍼에 쌓아두었다가 데이터를 한 번에 읽음으로써 읽기 성능을 향상시키는 보조 스트림이다.
- BufferedOutputStream(BufferedWriter)은 외부의 출력 장치로 데이터를 직접 출력하지 않고 버퍼에 쌓아두었다가 데이터를 한 번에 전송함으로써 출력 성능을 향상시키는 보조 스트림이다.
기본 타입 입출력 보조 스트림
- 입출력 장치로 객체를 읽고 출력하는 경우에 사용
- 객체는 문자 데이터가 아니므로, 출력하거나 저장하려면 바이트 형태로 직렬화해야함
- 직렬화 : 스트림을 통해서 객체를 출력하기 위해 연속적인 데이터로 변환하는 것
- 역직렬화 : 스트림을 통해서 읽어들인 연속적인 데이터를 객체로 복원하는 것
- ObjectInputStream은 InputStream에 연결되어 객체를 역질렬화하는 보조 스트림
- objectOutputStream은 OutputStream에 연결되어 객체를 직렬화하는 보조 스트림