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 |
StringReader | StringWriter |
보조 스트림
실제 데이터를 주고 받는 스트림이 아니라 스트림의 기능을 보완하는 역할
스트림의 기능을 향상시키거나 새로운 기능을 추가
FilterInputStream
,FilterOutputStream
은InputStream
,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 |