본문 바로가기

JAVA

Java 입출력 I/O Stream - 바이트 기반 스트림, 문자 기반 스트림, 보조 스트림

I/O Stream

  • 데이터를 운반하는데 사용되는 연결통로
  • 단방향 통신만 가능하므로 입력 스트림(input stream)과 출력 스트림(output stream) 2개의 스트림이 필요
  • FIFO(First In First Out) 구조

바이트 기반 스트림

  • 스트림은 바이트 단위로 데이터를 전송
  • java.io 패키지에서 입출력을 처리할 수 있는 표준화된 방법 제공
  • InputStream, OutputStream이 최상위 추상 클래스
입력스트림 출력스트림 입출력 대상
FileInputStream FileOutputStream 파일
ByteArrayInputStream ByteArrayOutputStream 메모리(byte 배열)
PipedInputStream PipedOutputStream 프로세스
AudioInputStream AudioOutputStream 오디오장치

문자 기반 스트림 - Reader, Writer

  • 입출력 단위가 1byte인 바이트 기반 스트림과 달리 입출력 단위가 2byte로 문자 char형을 처리
  • 여러 종류의 인코딩과 자바에서 사용하는 유니코드(UTF-16)간의 변환을 자동적으로 처리
    • Reader는 특정 인코딩을 읽어 유니코드로 변환, Writer는 유니코드를 특정 인코딩으로 변환
바이트 기반 스트림 문자 기반 스트림
FileInputStream | FileOutputStream FileReader | FileWriter
ByteArrayInputStream | ByteArrayOutputStream CharArrayReader | CharArrayWriter
PipedInputStream | PipedOutputStream PipedReader | PipedWriter
StringBufferedInputStream | StringBufferedOutputStream(deprecated) StringReader | StringWriter

보조 스트림

  • 실제 데이터를 주고 받는 스트림이 아니라 스트림의 기능을 보완하는 역할

  • 스트림의 기능을 향상시키거나 새로운 기능을 추가

  • FilterInputStream, FilterOutputStreamInputStream, OutputStream의 자손이면서 모든 보조스트림의 조상

  • 보조 스트림만으로 입출력을 처리할 순 없고, 기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림을 생성

    FileInputStream fis = new FileInputStream("text.txt");
    BufferedInputStream bis = new BufferedInputStream(fis);
    bis.read();

    실제 입력기능은 FileInputStream이 수행하고 BufferedInputStream은 버퍼만 제공


입력 출력 설명
FilterInputStream FilterReader FilterOutputStream FilterWriter 필터를 이용한 입출력 처리
BufferedInputStream BufferdReader BufferedOutputStream BufferdWriter 버퍼를 이용한 입출력 성능 향상
DataInputStream DataOutputStream int, float와 같은 기본형 단위(pirmitive type)으로 데이터를 처리하는 기능
SequenceInputStream 없음 두 개의 스트림을 하나로 연결
LineNumberReader 없음 읽어온 데이터의 라인 번호를 카운트(JDK1.1 이후)
ObjectInputStream ObjectInputStream 데이터를 객체 단위로 읽고 쓰는데 사용. 주로 파일을 이용하며 객체 직렬화와 관련
없음 PrintStream PrintWriter 버퍼를 이용. 추가적인 print 관련 기능
PushbackInputStream PushbackReader 없음 버퍼를 이용해서 읽어온 데이터를 다시 되돌리는 기능

BufferdInputStream과 BufferdOutputStream

  • 스트림의 입출력 효율을 높이기 위해 버퍼를 사용하는 보조 스트림
  • 1byte씩 입출력하는 것이 아니라 버퍼(바이트 배열)을 이용하여 속도 향상
BufferdInputStream(InputStream in, int size) 주어진 InputStream을 입력소스로 하며 지정된 크기(byte단위)의 버퍼를 갖는 인스턴스 생성
BufferdInputStream(InputStream in) 주어진 InputStream을 입력소스로 하며 기본 버퍼 크기인 8192byte 크기의 버퍼를 갖는 인스턴스 생성. 보통 입력소스가 파일인 경우
  • 버퍼 크기는 입력 소스로부터 한 번에 가져올 수 있는 데이터의 크기로 지정
  • read() 메소드가 호출 되면 BufferdInputStream은 버퍼 크기만큼의 데이터를 읽어 내부 버퍼에 저장, 프로그램에서는 BufferdInputStream 버퍼에 저장된 데이터를 읽어 속도가 훨씬 빠름
BufferdOutputStream(OutputStream out, int size) 주어진 OutputStream을 출력소스로 하며 지정된 크기(byte단위)의 버퍼를 갖는 인스턴스 생성
BufferdOutputStream(OutputStream out) 주어진 OutputStream을 출력소스로 하며 기본 버퍼 크기인 8192byte 크기의 버퍼를 갖는 인스턴스 생성. 보통 입력소스가 파일인 경우
flush() 버퍼의 모든 내용을 출력 소스에 출력한 후 버퍼를 비움
close() flush()를 호출하고 BufferdOutputStream 인스턴스가 사용하던 모든 자원을 반환
  • write() 메소드를 이용한 출력이 BufferdOutputStream 버퍼에 저장, 버퍼가 가득 차면 버퍼의 모든 내용을 출력소스에 출력하고 버퍼를 비움
  • 버퍼가 가득 찬 경우에만 출력을 하기 때문에 마지막 부분이 BufferdOutputStream의 버퍼에 남아있는 채로 프로그램이 종료될 수 있어 모든 출력작업 후 flush()close() 메소드를 호출해주어야 함
  • 이 때 기반스트림의 close() 역시 호출하므로 기반 스트림의 flush()close()를 따로 호출해줄 필요가 없음

InputStreamReader와 OutputStreamWriter

  • 바이트 기반 스트림을 문자 기반 스트림으로 연결시켜주는 역할
  • 바이트 기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환
InputStreamReader(InputStream in) OS에서 사용하는 기본 인코딩의 문자로 변환하는 InputStreamReader 생성
InputStreamReader(InputStream in, String encoding) 지정된 인코딩을 사용하는 InputStreamReader 생성
String getEncoding() InputStreamReader의 인코딩 반환
OutputStreamWriter(OutputStream out) OS에서 사용하는 기본 인코딩의 문자로 변환하는 OutputStreamWriter 생성
OutputStreamWriter(OutputStream out, String encoding) 지정된 인코딩을 사용하는 OutputStreamWriter 생성
String getEncoding() OutputStreamWriter의 인코딩 반환

'JAVA' 카테고리의 다른 글

[DB] JDBC, Connection Pool, Datasource 이해  (0) 2023.12.04
JAVA Collections Framework  (0) 2023.06.19
[JavaFX] Scene Builder 설치 및 설정  (0) 2021.08.14
Java 배열  (0) 2021.08.12
Java 인터페이스  (0) 2021.08.10