01 스트림 입출력
02 바이트 스트림 다루기
03 문자 스트림 다루기
04 버퍼 입출력(Buffered I/O)
# 임출력 스트림(Stream)
- 자바의 스트림은 입력/출력 장치와 프로그램 사이의 데이터 흐름, 또는 소프트웨어 장치를 뜻한다.
# 입출력 스트림(Stream)의 특징
º 스트림의 양끝에는 입출력 장치와 자바 응용프로그램이 연결
- 자바 응용프로그램은 입력 스트림과 출력 스트림과만 연결하고, 입출력 스트림이 입출력 장치를 제어하고 실질적인 입출력을 담당
º 스트림은 단방향임
- 입력 스트림은 입력 장치에서 응용 프로그램으로 데이터를 전송, 출력 스트림은 응용프로그램으로부터 받은 데이터를 출력 장치로 전송
- 두 가지 기능을 모두 가진 스트림은 없음
º 스트림을 통해 흘러가는 기본 단위는 바이트나 문자임
º 스트림은 선입선출(FIFO) 구조
- 입력 스트림에 먼저 들어온 데이터가 응용프로그램에 먼저 전달, 출력 스트림은 응용프로그램이 출력한 순서대로 출력 장치에 보냄.
# 스트림 연결 예제
- 표준 입력 스트림 System.in에 InputStreamReader 스트림을 연결하는 사례
표준 입력 스트림을 문자 스트림으로 변환
InputStreamReader rd = new InputStreamReader(System.in);
int c = rd.read(); // 키보드에서 문자 1개 씩 읽어서 정수로 리턴
# InputStreamReader의 메소드와 생성자
InputStream의 메소드 | 설명 |
void close() | 입력 스트림을 닫고 관련된 시스템 자원 해제 |
String getEncoding() | 스트림이 사용하는 문자 집합의 이름 리턴 |
int read() | 한 개의 문자를 읽어 정수형으로 리턴 (없을 경우 -1 반환) |
int read(char[] cbuf, int offset, int length) | 최대 len 개수의 문자들을 읽어 cbuf 배열의 off 위치부터 저장하고 실제 읽은 개수 리턴 |
boolean ready() | 입력 스트림이 문자를 읽어 들일 수 있는 상태인지 리턴 |
InputStream의 생성자 | 설명 |
InoutStreamReader(InputStream in) | in으로부터 읽는 기본 문자 집합의 InputStreamReader 생성 |
InputStreamReader (InputStream in, Charset cs) |
in으로부터 읽는 cs 문자 집합의 InputStreamReader 생성 |
InputStreamReader (InputStream in, String charsetName) |
in으로부터 읽는 charsetName 문자집합 InputStreamReader 생성 |
# 자바 입출력 스트림의 종류
º 바이트 입출력 스트림(byte stream)
- 단순 바이트의 흐름으로만 처리
- ex) 바이너리 파일을 읽는 입력 스트림
º 문자 입출력 스트림(character stream)
- 문자의 흐름으로 처리
- 문자가 아닌 바이너리 데이터는 문자 스트림에서 처리하지 못함.
- ex) 텍스트 파일을 읽는 입력 스트림
# 바이트 스트림 클래스
º 바이트 스트림 : 바이트 단위의 바이너리 값을 읽고 쓰는 스트림
º 바이트 스트림 클래스 : java.io 패키지에 포함
- InputStream / OutputStream
→ 추상 클래스
→ 바이트 입출력 스트림을 다루는 모든 클래스의 슈퍼 클래스
(1) FileInputStream / FileOutputStream
- 파일로부터 바이트 단위로 읽거나 저장하는 클래스
- 바이너리 파일의 입출력
(2) DataInputStream / DataOutputStream
- 자바의 기본 데이터 타입의 값(변수)을 바이너리 값 그대로 입출력
# FileOutputStream 클래스의 메소드와 생성자
FileOutputStream의 메소드 | 설명 |
void write(int b) | int 형으로 넘겨진 한 바이트를 출력 스트림으로 출력 |
void write(byte[] b) | 배열 b의 바이트를 모두 출력 스트림으로 출력 |
void write(byte[] b, int off, int len) | len 크기만큼 off부터 배열 b를 출력 스트림으로 출력 |
void flush() | 출력 스트림에서 남아 있는 바이너리 데이터 모두 출력 |
void close() | 출력 스트림을 닫고 관련된 시스템 자원 해제 |
FileOutputStream의 생성자 | 설명 |
FileOutputStream(File file) | file이 지정하는 파일에 출력하는 FileOutputStream 생성 |
FileOutputStream(String name) | name이 지정하는 파일에 출력하는 FileOutputStream 생성 |
FileOutputStream (File file, Boolean append) |
FileOutputStream을 생성하며 append가 true이면 file이 지정하는 파일의 마지막부터 데이터 저장 |
FileOutputStream (String name, Boolean append) |
FileOutputStream을 생성하며 append가 true이면 name이 름의 파일의 마지막부터 데이터 저장 |
# DataInputStream & DataOutputStream 메소드
- DataInputStream과 DataOutputStream 클래스는 기초 자료형 단위로 데이터를 읽고 쓸 수 있음
- 바이트 단위가 아니라 double 타입으로 읽고 쓸 수 있음
- 각 자료형의 크기가 다르기 때문에 쓸 때와 동일한 순서로 읽어야 함
# 문자 스트림
º 문자 스트림 : 유니 코드로 된 문자를 입출력하는 스트림
- 문자 데이터만 다룬다. 이미지, 동영상과 같은 바이너리 데이터는 (x)
º 문자 스트림을 다루는 클래스
- Reader / Writer
→ java.io 패키지에 포함
→ 추상 클래스. 문자 스트림을 다루는 모든 클래스의 슈퍼 클래스
(1) InputStreamReader / OutputStreamWriter
- 바이트 스트림과 문자 스트림을 연결시켜주는 다리 역할
- InputStreamReader : 바이트를 읽어 문자로 인코딩하여 입력
- OutputStreamWriter : 문자를 바이트로 디코딩하여 출력
(2) FileReader / FileWriter
- 텍스트 파일에서 문자 데이터 입출력
# FileReader의 메소드와 생성자
FileReader의 메소드 | 설명 |
int read() | 한 개의 문자를 읽어 정수형으로 리턴 |
int read(char[] cbuf) | 최대 cbuf 배열의 크기만큼 문자들을 읽어 cbuf 배열에 저장. 만일 읽는 도중 EOF를 만나면 실제 읽은 문자 개수 리턴 |
int read(char[] cbuf, int off, int len) | 최대 len 크기만큼 읽어 cbuf 배열의 off부터 저장. 읽는 도중 EOF를 만나면 실제 읽은 문자 개수 리턴 |
String getEncoding() | 스트림이 사용하는 문자 집합의 이름 리턴 |
void close() | 입력 스트림을 닫고 관련된 시스템 자원 해제 |
FileReader의 생성자 | 설명 |
FileReader(File file) | file에 지정된 파일로부터 읽는 FileReader 생성 |
FileReader(String name) | name 이름의 파일로부터 읽는 FileReader 생성 |
# FileWriter의 메소드와 생성자
FileWriter의 메소드 | 설명 |
void write(int c) | c를 char로 반환하여 한 개의 문자 출력 |
void write(String str) | 문자열 str 출력 |
void write(String str, int off, int len) | 인덱스 off부터 len개의 문자를 str 문자열에서 출력 |
void write(char[] cbuf, int off, int len) | 인덱스 off부터 len개의 문자를 배열 cbuf에서 출력 |
void flush() | 스트림에 남아 있는 텍스트 모두 출력 |
String getEncoding() | 스트림이 사용하는 문자 집합의 이름 리턴 |
void close() | 출력 스트림을 닫고 관련된 시스템 자원 해제 |
FileWriter의 생성자 | 설명 |
FileWriter(File file) | file에 데이터를 저장할 FileWriter 생성 |
FileWriter(String name) | name 파일에 데이터를 저장할 FileWriter 생성 |
FileWriter(File file, Boolean append) | FileWriter를 생성하여, append가 true이면 파일의 마지막부터 데이터 저장 |
FileWriter(String name, Boolean append) | FileWriter를 생성하며, append가 true이면 파일의 마지막부터 데이터 저장 |
# FileReader / FileWriter vs FileInputStream / FileOutputStream
º FileReader / FileWriter 과 FileInputStream / FileOutputStream 모두 File에 데이터를 입력하고 출력하는 객체로 두 종류의 객체는 차이가 있음
- FileInputStream / FileOutputStream : InputStream / OutputStream을 상속
- FileReader / FileWriter : Reader / Writer을 상속
- FileInputStream / FileOutputStream : byte 단위의 입출력을 처리
- FileReader / FileWriter : 바이트를 문자(Char)로 변환하여 입출력을 처리
- FileInputStream / FileOutputStream : 1바이트 이상의 문자인 한글 등을 처리하기 위해 버퍼를 사용해서 처리
- FileReader / FileWriter : 한글도 처리 가능
# 요약
- 입출력 스트림은 입출력 장치와 프로그램 사이의 일련의 데이터 흐름
- 문자 스트림은 유니코드로 된 문자 단위의 데이터가 흐르는 스트림, 문자가 아닌 정보는 문자 스트림의 데이터가 될 수 없음
- 문자 스트림을 다루는 자바의 모든 클래스는 추상 클래스인 Reader와 Writer 클래스의 서브 클래스임
- 문자 스트림은 문자 정보를 가진 텍스트 파일만 처리할 수 있고 바이너리 파일의 입출력에는 사용할 수 없음
- 문자 입력 스트림을 다루는 자바 클래스에는 Reader, InputStreamReader, FileReader 등이 있음
- 문자 출력 스트림을 다루는 자바 클래스에는 Writer, OutputStreamWriter, FileWriter 등이 있음
- 바이트 스트림은 8비트 바이트 단위의 데이터가 흐르는 스트림
- 바이트 스트림을 다루는 자바의 모든 클래스는 추상 클래스인 InputStream과 OutputStream의 서브 클래스임
- 바이트 스트림은 텍스트 파일의 입출력에도 사용 가능하지만 이미지나 동영상과 같은 바이너리 데이터를 입출력하는 데 보다 적합
- 바이트입력 스트림을 다루는 자바 클래스에는 InputStream, FileInputStream, DataInputStream 등이 있음
- 바이트 출력 스트림을 다루는 자바 클래스에는 OutputStream, FileOutputStream, DataOutputStream 등이 있음
- 버퍼 입출력(Buffered I/O)은 입출력 스트림과 프로그램 사이에 버퍼를 두어 입출력 장치의 속도와 프로그램의 처리 속도의 완충 작용을 수행하므로 효율적으로 입출력을 처리
- 바이트 버퍼 스트림을 다루는 자바 클래스는 BufferedInputStream과 BufferedOutputStream이 있음
- 문자 버퍼 스트림을 다루는 자바 클래스는 BufferedReader와 BufferedWriter가 있음
- File 클래스는 파일과 디렉터리 경로명의 추상적 표현임
- File 클래스는 파일 삭제, 파일 이름 변경, 디렉터리 생성 등과 같은 파일 관리 작업을 수행
- 클래스는 파일 입출력을 위한 기능은 제공하지 않음.
'JAVA > 자바 이론' 카테고리의 다른 글
Java | Lab7-2 제네릭과 컬렉션 (0) | 2021.06.12 |
---|---|
Java | 7-1 제네릭과 컬렉션 (0) | 2021.06.10 |
Java | 6 패키지 (0) | 2021.06.06 |
Java | 5-2 상속과 다형성 (0) | 2021.05.25 |
Java | 5-1 상속과 다형성 (0) | 2021.05.25 |