# I/O (입출력)
- I/O : Input과 Output으로 입력과 출력을 의미한다.
자바에서 데이터는 Stream을 통해 전송된다.
- 스트림(Stream) : 데이터를 운반하는데 사용되는 연결통로
단방향통신만 가능하기 때문에 입출력을 위해선 입력스트림과 출력스트림이 각각 필요하다.
FIFO(First In First Out) 구조로 되어 있다.
- IO 패키지의 클래스 계층 구조
# 바이트기반 스트림(Byte Stream) : 바이트단위로 데이터를 전송하는 스트림
- Input Stream(입력 스트림) : 바이트 기반 입력 스트림의 최상위 클래스, 추상 클래스
메소드명 | 설명 |
public abstract int read() throws IOException | 1byte씩 읽고 읽은 내용 반환 더 이상 읽을 메소드가 없으면 -1 반환 |
public void close() throws IOException | 입력 스트림 종료 |
public int read(byte[] b) throws IOException | 배열 b의 크기만큼 읽고 실제로 읽어들인 byte의 수를 반환 더 이상 읽을 데이터가 없으면 -1 반환 |
public int read(byte[] b, int off, int len) throws IOException | len 개의 byte만큼 읽고, b[off]부터 len만큼 (b[off+len-1]) 저장한 뒤 실제로 읽어들인 byte 수인 len을 반환 만약 len만큼 읽지 못했다면 실제로 읽은 byte 수 반환 |
- Output Stream(출력 스트림) : 바이트 기반 출력 스트림의 최상위 클래스, 추상 클래스
메소드명 | 설명 |
public abstract void write(int b) throws IOException | 주어진 값을 출력소스에 쓴다. |
public void close() throws IOException | 출력 스트림 종료 |
public void write(byte[] b, int off, int len) throws IOException | 배열 b로 전달된 배열을 대상으로 off의 인덱스 위치부터 len byte를 전송 |
public void write(byte[] b) throws IOException | 주어진 배열 b에 저장된 모든 byte 출력 |
public void flush() throws IOException | 버퍼에 남아 있는 모든 byte 출력 데이터의 중요도가 높거나 버퍼가 꽉차지 않아도 출력 스트림을 통해 파일에 저장해야 할 데이터가 존재하는 경우 호출 |
- FileInputStream : 바이트 단위의 입력을 받는 클래스이다.
- FileOutputStream : 바이트 단위의 출력을 내보내는 클래스이다.
# 문자기반 스트림(Character Stream) : char형이 2byte이기 때문에 생기는
바이트기반 스트림의 단점을 보완하기 위해 만들어진 스트림
운영체제의 기본 인코딩 방식으로의 인코딩을 자동화하기 위해서 존재함
- Reader : 문자 기반 입력 스트림의 최상위 클래스, 추상 클래스
메소드명 | 설명 |
public int read() throws IOException | 파일로부터 읽어들인 문자 하나 반환 더 이상 읽을 메소드가 없으면 -1 반환 |
public abstract int read(char[] cbuf, int off, int len) throws IOException | 최대 len의 개수만큼 문자를 읽어 들여 cbuf로 전달된 배열의 인덱스 위치 off에서부터 문자 저장 후 실제로 읽어들인 문자 수 반환 더 이상 읽을 메소드가 없으면 -1 반환 |
- Writer : 문자 기반 출력 스트림의 최상위 클래스, 추상 클래스
메소드명 | 설명 |
public void write(int c) throws IOException | 파일에 하나의 문자를 저장 |
public abstract void write(char[] cbuf, int off, int len) throws IOException | cbuf로 전달된 배열의 인덱스 위치 off에서부터 len개의 문자를 파일에 저장 (최대 len 아님) |
- FileReader : 파일로부터 텍스트데이터인 byte를 문자로 변환해서 읽어들이는 클래스
- FileWriter : 출력할 유니코드 문자를 디폴트 문자 인코딩의 byte로 변환해 파일에 저장하는 클래스
# 장식대상 vs 장식하는 클래스
//Tip : 보조스트림 관계도
- 보조스트림 : 주 스트림인 Input스트림과 Output스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.
단독으로 사용될 수 없으며, 데이터를 입출력하는 기능은 없다.
- 필터 스트림 : 보조스트림 내 가장 상위 스트림이다.
- 버퍼스트림, 데이터스트림 : 필터 스트림에 속한다.
# 필터 스트림(Filter Stream) : 기본 스트림의 기능을 확장시키거나 사용하기 쉽게 변환해주는 스트림
[byte 기반]
- 필터 입력 스트림 : 입력 스트림에 연결하는 필터 스트림, FilterInputStream 클래스 상속
- 필터 출력 스트림 : 출력 스트림에 연결하는 필터 스트림, FilterOutputStream 클래스 상속
# 버퍼링 기능을 제공하는 필터 스트림 : 속도가 크게 향상되는 장점이 있다.
ex) 벽돌을 한장 씩 옮기는 것보다 벽돌을 나르는 손수레가 있으면 훨씬 빠른 것
[byte 기반]
- BufferedInputStream : 버퍼 필터 입력 스트림
public BufferedInputStream(InputStream in, int size)
BufferedInputStream 데이터를 읽어 들이는 메소드 |
public int read() throws IOException |
public int read(byte[] b, int off, int len) throws IOException |
- BufferedOutputStream : 버퍼 필터 출력 스트림
public BufferedOutputStream(OuputStream out, int size)
[Char 기반]
- BufferedReader : 버퍼 필터 입력 스트림
public String readLine() throws IOException
- BufferedWriter : 버퍼 필터 출력 스트림
public void write(String str) throws IOException
- PrintStream : 데이터를 기반스트림에 다양한 형태로 출력할 수 있는
print, println, printf와 같은 메소드를 오버로딩하여 제공
바이트 스트림
ex) System.out (이 이상으로 PrintStream 활용하지 않기!)
- PrintWriter : Writer 클래스를 상속하는 문자 필터 스트림
문자열 단위의 출력이 필요한 경우 반드시 사용하기
// Tip : 데코레이터 패턴
하나의 클래스를 장식하는 것처럼 생성자에서 감싸서
새로운 기능을 계속 추가할 수 있도록 클래스를 만드는 방식
# RandomAccessFile : 하나의 클래스로 파일에 대한 입출력을 모두 할 수 있음
- 특징 : 입력과 출력이 동시에 이뤄질 수 있다
입출력 위치를 임의로 변경할 수 있다
파일을 대상으로만 존재하는 스트림이다. (엄밀히는 스트림 클래스가 아니다.)
# 직렬화(Serialization) : 객체에 저장된 데이터를 스트림에 쓰기(write) 위해
연속적인(serial) 데이터로 변환하는 것
인스턴스가 파일에 저장되는 과정
직렬화를 위해선 아래와 같은 인터페이스를 구현해줘야 한다.
java.io.Serializable
↕
역직렬화(deserialization) : 스트림으로부터 데이터를 읽어서 객체를 만드는 것
파일로부터 인스턴스가 복원되는 과정
# File 클래스 : 파일 및 디렉터리 관련 연산을 위함
- 기능 : 디렉터리의 생성 및 소멸
파일의 소멸
디렉터리 내 존재하는 파일이름 출력
'SW > Java' 카테고리의 다른 글
[필기정리]Day27 - 쓰레드 이론 및 문제 (0) | 2020.07.16 |
---|---|
[필기정리]Day26 - 전화번호 관리 프로그램 08단계 문제 (0) | 2020.07.15 |
[필기정리]Day25 - I/O모델 문제 (0) | 2020.07.14 |
[필기정리]Day24 - I/O 모델 (0) | 2020.07.13 |
[필기정리]Day23 - 컬렉션 프레임워크 문제 (0) | 2020.07.10 |