자바/입출력 IO

보조 스트림과 문자 기반 스트림

백_곰 2022. 4. 22. 13:56

1. 보조 스트림이란

- 보조 스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 입출력을 할 수 없지만,

스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.

 

- 그러므로, 주 스트림을 먼저 생성 후, 이를 이용해서 보조 스트림을 생성해야 한다.

 

 

- 아래의 예시를 보고 이해하자.

Ex) test.txt라는 파일을 읽기위해 FileInputStream을 사용할 때, 입력 성능을 향상시키기 위해

버퍼를 사용하는 보조 스트림인 BufferedInputStream을 사용하는 코드는 다음과 같다.

 

FileInputStream fis = new FileInputStream("test.txt");

// 먼저 주 스트림을 생성한다.

 

BufferedInptuStream bis = new BuffedInputStream(fis);

// 주 스트림을 이용해서 보조 스트림을 생성한다.

 

bis.read();

// 보조 스트림인 BufferedInputStream으로부터 데이터를 읽는다.

 

 

( 코드 상으로는 BufferedInptuStream이 입력 기능을 수행하는 것처럼 보이지만, 실제로는

FileInputStream이 수행하고, BufferedInptuStream은 버퍼만 제공하게 된다. )

 

( 실제로 Buffer를 입력 받고 안 받고의 성능 차이가 상당하기 때문에, 보조 스트림을 권장한다. )

 

 

 

- 아래는 보조 스트림의 종류이다.

( InputStreamOuputStream을 붙이는 것을 생략하였다. )

 

(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 InputStreamOutputStreamReaderWriter로 대체되어 더 이상

사용되지 않는다. )

 

( 추가적으로 ByteArrayInputStreamOutputStreamCharArrayReaderWriter로 변환된다. )

 

 

- 바이트 기반 스트림과 문자 기반 스트림에서의 차이는 메서드에 있는데, 추상 메서드 지정한 것과 이름만

조금 다를 뿐 활용방법은 같다. 아래의 표를 보고 이해하자.

 

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로 바뀌게 된다. )