✔️ I/O : Input과 OutPut의 약자로 입력과 출력을 의미함.
System.out.println()
을 이용해서 화면 출력 등✔️ 데이터를 운반하는데 사용되는 연결통로
자바에서 입출력을 수행하고 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있게 하는 stream
이 필요하다.
✔️ 물이 한쪽 방향으로만 흐르는 것과 같이 단방향통신만 가능한 stream.
그래서 하나의 stream
으로 입력과 출력을 동시에 처리할 수 없다.
입력과 출력을 동시에 수행하려면,
입력스트림(input stream)과 출력스트림(output stream) 모두 2개의 스트림이 필요하다.
✔️ FIFO(First In First Out) 구조
stream
은 먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고받는다.
InputStream, OutputStream
스트림은 바이트단위로 데이터를 전송하며 입출력 대상에 따라 4종류의 입출력스트림이 있다.
✏️ InputStream
✏️ OutputStream
❗️ read()의 반환타입이 byte가 아니라 int인 이유는 read()의 반환값이 0~255와 -1이기 때문이다.
입출력의 대상에 따라 읽고 쓰는 방법이 다를 것이기 때문에 각 상황에 알맞게 구현하라는 의미에서 추상메서드로 정의되어 있다.
✔️ 스트림의 기능을 보완하기 위해 제공됨
예를 들어, test.txt라는 파일을 읽기 위해 FileInputStream
을 사용할 때,
입력 성능을 향상시키기 위해 버퍼를 사용하는 보조스트림인 BufferedInputStream
을 사용하는 코드를 사용한다.
// 먼저 기반 스트림을 생성
FileInputStream fis = new FileInputStream("test.txt");
// 기반 스트림을 이용해서 보조 스트림을 생성
BufferedInputStream bis = new BufferedInputStream(fis);
// 보조 스트림인 BufferedInputStream으로부터 데이터를 읽는다.
bis.read();
실제 입력기능은 BufferedInputStream 과 연결된 FileInputStream
이 수행하고, 보조스트림인 BufferedInputStream
은 버퍼만을 제공한다.
Reader, Writer
Java에서는 한 문자를 의미하는 char형이 1byte가 아니가 2byte이기 때문에 바이트기반의 스트림으로 2byte인 문자를 처리하는 데는 어려움이 있다.
이 점을 보완하기 위해서 문자기반의 스트림이 만들어졌고 문자데이터를 입출력할 떄는 바이트기반 스트림 대신 문자기반 스트림을 이용해야 한다.
❗️ InputStream ➡️ Reader
❗️ OutputStream ➡️ Writer
References
: https://cafe.naver.com/javachobostudy