스트림(stream)
"순서가 있는 데이터의 연속적인 흐름"
|바이트 스트림과 문자 스트림
바이트 스트림 : 8비트의 바이트 단위로 입출력하는 클래스, 이진 데이터를 읽고 쓰기 위하여 사용.
문자 스트림 : 문자 단위로 입출력하는 클래스, 기본적으로 유니코드를 저장.
|데이터 싱크와 데이터 처리
데이터 싱크 스트림 : 소스나 목적지에 데이터를 입출력(메모리, 파이프, 파일)
데이터 처리 스트림 : 데이터 가공(그 외)
바이트 스트림
모든 바이트 스트림은 InputStream과 OutputStream에서 파생
|InputStream과 OutputStream 클래스
int read( ) : 한 바이트를 읽어서 int 타입으로 반환, 읽을 값이 없으면 -1을 반환
int read(byte[] buf) : buf의 크기만큼 데이터를 읽어서 buf에 저장하고 읽은 바이트 수를 반환
int read(byte[] buf, int offset, int length) : length만큼의 데이터를 읽어서 buf의 offset위치에 저장하고 읽은 바이트 수를 반환
void write(int data) : data의 하위 8비트를 출력
void write(byte[] buf) : buf[]에 저장된 바이트들을 출력
void write(byte[] buf, int offset, int length) : buf의 offset 위치에 length만큼의 바이트를 출력
|FileInputStream과 FileOutputStream 클래스
FileInputStream 클래스는 파일에서 바이트를 읽고 FileOutputStream 클래스는 파일에다가 바이트를 쓴다.
FileInputStream의 생성자
1. FileInputStream(File file) : File 객체에 연결된 파일로부터 바이트를 읽는 객체를 생성한다.
2. FileInputStream(String name) : 파일의 경로 이름이 name인 파일과 연결된 입력 담당 객체를 생성한다.
FileOutputStream의 생성자
1. FileOutputStream(File file) : File 객체가 나타내는 파일에 바이트를 쓰는 객체를 생성한다.
2. FileOutputStream(String name) : 파일의 경로 이름이 name인 파일과 연결된 출력 담당 객체를 생성한다.
3. FileOutputStream(String name, boolean append) : append가 true이면 파일의 끝에 바이트를 추가하고 false이면 바이트를 기존의 바이트 위에 겹쳐서 쓴다.
<예제>
출력결과
->read( )가 int 값을 반환하는 이유는 입력 스트림의 끝을 표시하는데 -1을 사용하기 위해
->더 이상 사용하지 않는 스트림을 닫는 것이 중요. 소스에서 만약 오류가 발생했을 경우에도 finally 블록을 사용하여 스트림을 닫고 있다. 만약 스트림을 닫지 않으면 심각한 자원 누출이 발생한다.
|BufferedInputStream과 BufferedOutputStream 클래스
각 read나 write 요청은 운영체제에 의하여 요청하는 즉시 처리된다. 이것은 매우 비효율적인 방법이다. 왜냐하면 입출력 요청은 디스크 접근이나 네트워크 접근같은 매우 시간이 많이 걸리는 동작을 요구하기 때문이다. 따라서 오버헤드를 줄이기 위하여 버퍼링된 스트림을 제공
BufferedInputStream(InputStream in) : 입력 스트림 in을 감싸는 버퍼 입력 스트림 객체를 생성
BufferedInputStream(InputStream in, int size) : 버퍼 크기가 size인 버퍼를 가진 버퍼 입력 스트림을 생성
버퍼가 없는 스트림을 버퍼가 있는 스트림으로 변경
inputStream = new BufferedInputStream(new FileInputStream("data.txt"));
outputStream = new BufferedOutputStream(new FileOutputStream("data.txt"));
<예제>
출력결과
->여기서 만약 flush( )가 실행되지 않으면 출력이 나오지 않는다. 그 이유는 아직 버퍼가 다 차지 않았기 때문에 버퍼를 파일에 쓰지 않는다.
|DataInputStream과 DataOutputStream 클래스
기초 자료형 단위로 데이터를 읽고 쓸 수 있다.
<예제>
출력결과
->입력순서와 출력순서의 데이터타입을 동일하게 맞쳐야한다.
|ObjectInputStream과 ObjectOutputStream 클래스
객체의 입출력을 지원. 객체를 파일에 저장할 수 있고 또 반대로 파일에 저장된 객체를 읽어 들일 수 있다.
객체를 파일에 저장하려면 객체가 가진 데이터들을 순차적으로 데이터로 변환하는 절차가 필요 , 이것
을 직렬화(serialization)라고 한다. 어떤 클래스가 직렬화를 지원하려면 Serializable이라는 인터페이스를 구현해야 된다.
<예제 >
현재 날짜 객체를 저장하였다가 다시 읽어서 콘솔에 표시하기
출력결과
문자스트림은 다음 포스팅~
'Programming Language > Java' 카테고리의 다른 글
8. 입출력 - 형식 입출력 (0) | 2016.06.10 |
---|---|
7. 입출력 - 문자스트림 (2) | 2016.06.09 |
5. 스레드 (0) | 2016.06.08 |
4. 예외처리 (0) | 2016.06.08 |
3. Collections클래스 (0) | 2016.06.08 |