1. 보조 스트림이란
- 보조 스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 입출력을 할 수 없지만,
스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.
- 그러므로, 주 스트림을 먼저 생성 후, 이를 이용해서 보조 스트림을 생성해야 한다.
- 아래의 예시를 보고 이해하자.
Ex) test.txt라는 파일을 읽기위해 FileInputStream을 사용할 때, 입력 성능을 향상시키기 위해
버퍼를 사용하는 보조 스트림인 BufferedInputStream을 사용하는 코드는 다음과 같다.
FileInputStream fis = new FileInputStream("test.txt");
// 먼저 주 스트림을 생성한다.
BufferedInptuStream bis = new BuffedInputStream(fis);
// 주 스트림을 이용해서 보조 스트림을 생성한다.
bis.read();
// 보조 스트림인 BufferedInputStream으로부터 데이터를 읽는다.
( 코드 상으로는 BufferedInptuStream이 입력 기능을 수행하는 것처럼 보이지만, 실제로는
FileInputStream이 수행하고, BufferedInptuStream은 버퍼만 제공하게 된다. )
( 실제로 Buffer를 입력 받고 안 받고의 성능 차이가 상당하기 때문에, 보조 스트림을 권장한다. )
- 아래는 보조 스트림의 종류이다.
( InputStream과 OuputStream을 붙이는 것을 생략하였다. )
(1) Filter
: 필터를 이용한 입출력 처리
(2) Buffered
: 버퍼를 이용한 입출력 성능 향상
(3) Data
: int, float와 같은 기본형 단위로 데이터를 처리하는 기능
(4) Object
: 데이터를 객체단위로 읽고 쓰는데 사용
: 주로 파일을 이용하며 객체 직렬화와 관련있음
(5) Sequence
: 두 개의 스트림을 하나로 연결
: OutputStream은 없다.
(6) LineNumber
: 읽어 온 데이터의 라인 번호를 카운트
: OutputStream은 없다.
(7) Pushback
: 버퍼를 이용해서 읽어 온 데이터를 다시 되돌리는 기능
: OutputStream은 없다.
( printStream만 있는 스트림이 있는데, 버퍼를 이용하며, 추가적인 print 관련된 기능이다. )
2. 문자 기반 스트림 - Reader, Writer
- c언어와 달리 자바는 char 형이 1바이트가 아닌 2바이트이므로, 바이트기반 스틂에는 어려움이 있다.
- 이를 보완하기 위해 문자 기반의 스트림이 제공한다.
- 그러므로, 문자 데이터를 입출력할 때는 아래와 같이 바이트 기반 스트림이 아닌 문자 기반 스트림을
사용하는 것이 좋다.
InputStream -> Reader
OutputStream -> Writer
( 즉, FileInputStream -> FileReader로 변환한다. )
( 참고로 StringBuffer의 InputStream과 OutputStream은 Reader와 Writer로 대체되어 더 이상
사용되지 않는다. )
( 추가적으로 ByteArray의 InputStream과 OutputStream은 CharArray의 Reader와 Writer로 변환된다. )
- 바이트 기반 스트림과 문자 기반 스트림에서의 차이는 메서드에 있는데, 추상 메서드 지정한 것과 이름만
조금 다를 뿐 활용방법은 같다. 아래의 표를 보고 이해하자.
InputStream | Reader |
abstract int read() | abstract int read(char[] cbuf, int off, int len) |
int read(byte[] b) | int read() |
int read(byte[] b, int off, int len) | int read(char[] cbuf) |
OutputStream | Writer |
abstract void write(int b) | abstract void write(char[] cbuf, int off, int len) |
void write(byte[] b) | void write(int c) |
void write(byte[] b, int off, int len) | void write(char[] cbuf) |
void write(String str) | |
void write(String str, int off, int len) |
( 보조 스트림 또한 Reader와 Writer로 바뀌게 된다. )
'자바 > 입출력 IO' 카테고리의 다른 글
바이트 기반의 보조 스트림의 자손: Buffered 입출력 스트림 (0) | 2022.04.24 |
---|---|
바이트 기반의 보조 스트림의 조상: Filter 입출력 스트림 (0) | 2022.04.24 |
바이트 기반 스트림: File 입출력 스트림 (0) | 2022.04.24 |
바이트 기반 스트림: Byte 입출력 스트림 (0) | 2022.04.24 |
입출력의 개념 (0) | 2022.04.21 |