[Java] 입출력 I/O | stream

JTI·2023년 1월 14일
0

☕️  Java

목록 보기
48/59
post-thumbnail

💡 java.io


✔️ I/O : Input과 OutPut의 약자로 입력과 출력을 의미함.

  • 컴퓨터 내부 또는 외부의 프로그램간의 데이터를 주고 받는 것.
  • 키보드로부터 데이터 입력 / System.out.println() 을 이용해서 화면 출력 등

💡 stream


✔️ 데이터를 운반하는데 사용되는 연결통로

자바에서 입출력을 수행하고 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있게 하는 stream 이 필요하다.

✔️ 물이 한쪽 방향으로만 흐르는 것과 같이 단방향통신만 가능한 stream.

그래서 하나의 stream 으로 입력과 출력을 동시에 처리할 수 없다.

입력과 출력을 동시에 수행하려면,
입력스트림(input stream)출력스트림(output stream) 모두 2개의 스트림이 필요하다.

✔️ FIFO(First In First Out) 구조

stream 은 먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고받는다.

💡 Byte기반 stream


InputStream, OutputStream

스트림은 바이트단위로 데이터를 전송하며 입출력 대상에 따라 4종류의 입출력스트림이 있다.

📎 입력스트림과 출력스트림의 종류

  • 📎 파일: FileInputStream / FileOutputStream
  • 📎 메모리(byte배열): ByteArrayInputStream / ByteArrayOutputStream
  • 📎 프로세스: PipedInputStream / PipedOutputStream
  • 📎 오디오장치: AudioInputStream / AudioOutputStream

📎 입력스트림과 출력스트림에 정의된 읽기와 쓰기를 수행하는 메서드

✏️ InputStream

  • abstract int read()
  • int read(byte[] b)
  • int read(byte[] b, int off, int len)

✏️ OutputStream

  • abstract int write()
  • int write(byte[] b)
  • int write(byte[] b, int off, int len)

❗️ read()의 반환타입이 byte가 아니라 int인 이유는 read()의 반환값이 0~255와 -1이기 때문이다.

입출력의 대상에 따라 읽고 쓰는 방법이 다를 것이기 때문에 각 상황에 알맞게 구현하라는 의미에서 추상메서드로 정의되어 있다.

💡 보조 stream


✔️ 스트림의 기능을 보완하기 위해 제공됨

  • 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.
  • 보조 스트림만으로는 입출력을 처리할 수 없다.
  • 스트림을 먼저 생성한 다음에 이를 이용해서 보조 스트림을 생성해야 한다.

예를 들어, test.txt라는 파일을 읽기 위해 FileInputStream 을 사용할 때,
입력 성능을 향상시키기 위해 버퍼를 사용하는 보조스트림인 BufferedInputStream 을 사용하는 코드를 사용한다.

// 먼저 기반 스트림을 생성
FileInputStream fis = new FileInputStream("test.txt");

// 기반 스트림을 이용해서 보조 스트림을 생성
BufferedInputStream bis = new BufferedInputStream(fis);

// 보조 스트림인 BufferedInputStream으로부터 데이터를 읽는다.
bis.read();

실제 입력기능은 BufferedInputStream 과 연결된 FileInputStream 이 수행하고, 보조스트림인 BufferedInputStream 은 버퍼만을 제공한다.

💡 문자기반 스트림


Reader, Writer

  • 입출력 단위가 문자(char, 2byte)인 스트림, 문자기반 스트림의 최고조상

Java에서는 한 문자를 의미하는 char형이 1byte가 아니가 2byte이기 때문에 바이트기반의 스트림으로 2byte인 문자를 처리하는 데는 어려움이 있다.

이 점을 보완하기 위해서 문자기반의 스트림이 만들어졌고 문자데이터를 입출력할 떄는 바이트기반 스트림 대신 문자기반 스트림을 이용해야 한다.

❗️ InputStream ➡️ Reader
❗️ OutputStream ➡️ Writer

📎 바이트기반 스트림과 문자기반 스트림 비교


References
: https://cafe.naver.com/javachobostudy

profile
Fill in my own colorful colors🎨

0개의 댓글