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

2022. 4. 22. 13:56·자바/입출력 IO

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
'자바/입출력 IO' 카테고리의 다른 글
  • 바이트 기반의 보조 스트림의 조상: Filter 입출력 스트림
  • 바이트 기반 스트림: File 입출력 스트림
  • 바이트 기반 스트림: Byte 입출력 스트림
  • 입출력의 개념
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      outputstream
      TCP 소켓 프로그래밍
      다형성
      문자 기반 스트림
      불안정 정렬
      ServerSocket
      file
      코딩테스트
      java.time 패키지
      자바 개념
      람다식
      안정 정렬
      Collections Framework
      역직렬화
      Arrays
      알고스팟
      소켓 프로그래밍
      snail
      제자리 정렬
      코드트리
      유용한 클래스
      선택 정렬
      serializable
      중간연산
      java.lang패키지
      InputStream
      map()
      안드로이드 스튜디오
      스트림
      코딩트리조별과제
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    보조 스트림과 문자 기반 스트림
    상단으로

    티스토리툴바