JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter6

여러가지 보조 스트림 클래스들( InputStreamReader, BufferedInputStream, DataInputStream )

giggs 2022. 1. 24. 16:49

여러 가지 보조 스트림 클래스들

 

InputStreamReader, OutputStreamReader

BufferedInputStream, BufferedOutputStream

DataInputStream, DataOutputStream

 

 

보조 스트림

  • 실제 읽고 쓰는 스트림이 아닌 보조 기능을 제공하는 스트림
  • FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스들
  • 생성자의 매개변수로 또 다른 스트림(기반 스트림이나 다른 보조 스트림)을 가짐
  • - 매개변수로 받는 스트림의 기능은 제공하면서 +@ 의 기능을 제공하는 것 - 
  • Decorator Pattern으로 구현 됨
  • 상속을 받아서 구현하는 방식으로 하면 hierarchy 가 복잡해짐 - 여러 개의 다양한 기능 조합 제공 - 데코레이터 패턴
  • 상위 클래스 생성자
생성자 설명
protected FilterInputStream과(InputStream in) 생성자의 매개변수로 InputStream을 받습니다.
public FilterOutputStream(OutputStream out) 생성자의 매개변수로 OutputStream을 받습니다.

 

 

 

커피 ( 기반 스트림 ) 이 있고 + 아메리카노/ 라떼 (보조 스트림 ) + 아메리카노를 빠르게 만들어 주도록 도와준다 ( 보조+보조)

같이 쓰기 위해서는 포함해야 되는데 생성자에 스트림을 받는다. - 보조 스트림 - 혼자 못 들어가기 때문에

보조 스트림은 생성자 매개변수로 또 다른 스트림을 받는다.

fileInputStream OutputStream에서는 읽을 위치, 쓸 대상 등등을 매개변수로 받는다.

 

 


 

InputStreamReader와 OutputStreamWriter

 

바이트 단위로 읽거나 쓰는 자료를 -> 문자로 변환해주는 보조 스트림

FileInputStream으로 읽은 자료를 -> 문자로 변환해주는 예

 

-  reader.txt 생성 ( 한글 자료 )

-FileInputStream으로 한글 파일 읽기

1바이트씩 읽어오는 FileInputStream 에선는 한글 깨짐.

 

- InputStreamReader로 FileInputStream 감싸주기

 

한글 파일도 잘 출력되는 것 확인 - 

write의 경우도 같다.

 
FileInputStream 뿐만 아니라 다른 InputStream 이나 여러 스트림도 감쌀수있음.
원래 스트림의 기능 + 나의 기능 추가! 

 


 

BufferedInputStream과 BufferedOutputStream

 

  • 약 8k의 배열이 제공되어 입출력이 빠르게 하는 기능이 제공되는 보조 스트림
  • BufferedReader와 BufferedWriter는 문자용 입출력 보조 스트림
  • BufferedInputStream과 BufferedOutputStream을 이용하여 파일 복사하는 예

 

- 파일 인풋 스트림으로 읽어서 파일 아웃풋 스트림으로 써주기 

- 카피되는 시간을 계산하기 위해서 millisecond 

- 복사하는 소요시간 체크

 

 
한 바이트 읽고 한 바이트 쓰고 하느라 오래걸린다..
 
 

- 버퍼 스트림으로 감싸준다.

 

 

38.150 초에서 - 0.43초.. wow


 

파일 인풋 스트림이라서 버퍼드 인풋 스트림으로 감싸주었음

파일 리더인 경우 - 버퍼드 리더로 감싸주면 됨

 

+@ 보조 스트림은 또 다른 보조 스트림을 감싸 줄 수 있다.

 

 

 

컴파일 오류는 Exception 처리 안 해줘서 나온 것

보조 스트림은 또 다른 보조 스트림을 감싸줄 수 있다.

맨 마지막에 있는 스트림이 결국 실행되는 기반 스트림이다!

보조 스트림은 혼자 사용 불가능.

 

write의 경우에도 똑같이 사용

 


 

DataInputStream과 DataOutputStream

  • 자료가 메모리에 저장된 상태 그대로 읽거나 쓰는 스트림
  • 같은 정수라도 Byte정수/  int 정수 / short 정수 있을 수 있는데 그대로 쓰고 그대로 읽고 하는 스트림
  • 보조스트림이기 때문에 이미 읽거나 쓰는 스트림이 있는 상태에서 걔네들을 감싸줘서 사용한다.

 

 

  • DataInputStream 메서드

 

  • DataOutputStream 메서드

 

 

 


 

 

review

IO 스트림 구분 - 기능 여부
실제 IO기능이 있는 기반 스트림과 
실제 IO기능은 없지만 보조기능 제공하는 해 주는 보조 스트림

원래 기능의 기반 스트림에 추가 기능을 주기 위해서 상속받아서 기능 추가를 해주는 것이 아닌
매개변수로 기반 스트림이나 다른 보조 스트림을 받아와서 거기에 자신의 기능을 추가해주는 것이 핵심!
DataInput / DataOutput Stream 에서는 메모리에 쓸 때 사용한 자료형에 맞춰서 읽어주는것이 중요

보조 스트림으로 감싸주면 기능이 추가되어서
한 바이트씩 읽어온 것을 문자 단위로 읽을 수 있게 해 주고, 읽고 쓰는 속도도 빠르게 해 줄 수 있었다.
버퍼 보조 스트림으로 감싸주냐 아니냐의 차이가 너무 커서 놀랐다.
실제 업무에서도 자주 사용할 거 같은 느낌.

IO스트림의 종류는 정말. 너무나 많고 기능도 너무나 다양해서
실습해본 것 외에도 javadoc 참조해서 조금 더 살펴보아야 할 것 같다.