JAVA의 입출력 스트림(Stream)
입출력 스트림
클래스와 메모리, 저장 장치 사이에서 객체는 모두 메모리에 만들어지고 이것들은 모두 전원이 꺼지면 사라지게 된다. 이를 해결하기 위해 하드 디스크와 같은 저장 장치에 파일 형태로 저장하면 전원이 꺼지더라도 데이터가 보존된다.
데이터를 영구히 보관하기 위해 파일에 저장해야 하는데 스트림을 이용하면 파일을 저장할 수 있다.
■ 스트림(Stream)
✓ 자바의 입출력
-> 모든 하드웨어에 독립적으로 설계
✓ 자바는 입출력을 스트림(Stream)으로 처리한다.
✓ 스트림(Stream)
. 스트림은 '개울을 따라 시냇물이 졸졸 흘러간다.'라는 의미에서 순서가 있는 데이터의 연속적인 흐름이다.
. Java에서는 데이터를 읽고 쓸 때 스트림 형태로 읽고 쓴다.
✓ 스트림을 이용하여 실제 다양한 하드웨어와 입출력을 수행하는 일은 JVM에 의해 실행된다.
✓ 자바는 입출력을 위한 클래스들을 java.io 패키지로 제공하고있다.
■ 스트림(Stream)의 특징
✓ 스트림은 단방향이다. (방향에 따라 입력 스트림, 출력 스트림)
✓ 스트림은 선입선출, FIFO 구조이다.
✓ 스트림은 연결될 수 있다.
✓ 스트림은 지연될 수 있다.
. 입력 스트림이 흐르는 통로인 파이프가 비어 있다면, 컴퓨터는 읽어갈 데이터가 없으므로 기다림
. 출력 스트림이 흐르는 통로인 파이프에 데이터가 꽉 차 있다면 컴퓨터는 빈 공간이 생길 때까지 기다린다.
■ 스트림(Stream)의 분류
□ 바이트 스트림
✓ 바이트(8비트)를 읽고 쓰기 위한 스트림
✓ InputStream, OutputStream 클래스와 그 하위 클래스를 이용
✓ 문자 데이터든 바이너리 데이터든 상관없이 처리 가능
□ 문자 스트림
✓ 16비트 문자나 문자열을 읽고 쓰기 위한 스트림
- Reader, Writer 클래스와 하위 클래스를 이용
✓ 문자가 아닌 바이너리 데이터는 스트림에서 처리하지 못함
✓ 문자가 아닌 데이터를 문자 스트림으로 출력하면 깨져서 출력된다.
■ Java의 입출력 스트림
✓ 입출력 장치와 자바 응용 프로그램 연결
- 입력 스트림: 입력 장치로부터 자바 프로그램으로 데이터를 전달하는 객체
- 출력 스트림: 자바 프로그램에서 출력 장치로 데이터를 보내는 객체
✓ 특징
- 입출력 스트림 기본 단위: 바이트(Byte)
- 단방향 스트림, 선입선출 구조
■ 스트림 연결
✓ 여러 개의 스트림을 연결하여 사용할 수 있다.
ex) 키보드에서 문자를 입력받는 System.in과 InputStreamReader를 연결
InputStreamReader rd = new InputStreamReader(System.in);
■ 파일 입출력과 예외 처리
✓ 파일 입출력 동안 예외 발생 가능
1. 스트림 생성 동안FileNotFoundException 발생 가능!!
----> 파일의 경로명이 틀리거나 디스크의 고장 등으로 파일을 열 수 없을 때
2. 파일 읽기, 쓰기, 닫기를 하는 동안: IOException 발생 가능!!
----> 디스크 오동작, 파일이 중간에 깨진 경우, 디스크 공간이 모자라서 파일 입출력이 불가능한 경우.
✓ try-catch 블록이 반드시 필요하다.
■ 기본적인 메서드
✓ InputStream 클래스
- abstract int read() // 한 바이트를 읽어서 반환(0에서 255 사이의 정수)
✓ OutputStream 클래스
- abstract void write(int b) // 한 바이트를 특정한 장치에 씀
✓ Reader 클래스
- abstract int read() // 한 문자를 읽어서 반환