[필기정리] Day25 - IO 모델 셀프 핵심정리

SW/Java

2020. 7. 14. 22:47

# 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 클래스 : 파일 및 디렉터리 관련 연산을 위함

- 기능 : 디렉터리의 생성 및 소멸

           파일의 소멸

           디렉터리 내 존재하는 파일이름 출력

728x90