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

I/O 스트림의 구분 , 표준 입출력 스트림

giggs 2022. 1. 22. 18:56

 

자바의 입출력을 위한 I/O 스트림

 

앞에서 사용해본 자료 연산을 위한 stream 과는 다른

여기서 말하는 스트림은 자바가 입출력하기 위해서 사용하는 스트림 - 

입출력을 왜 스트림이라고 하느냐?

자료가 흘러가는 게 물의 흐름과 같다는 네트워크 용어에서 따와서 사용

 

입출력이라는 게 디바이스에 의존한다. ( 키보드, 마우스, 화면 출력, 네트워크 출력 등등)

입력받는 대상이나 출력하는 대상에 따라서 코딩이 다양해지는데 -  그 경로를 추상화해서 사용

 

I/O 스트림을 어려워하는 이유

다 Exception 처리를 해줘야 된다 - 코드가 점점 더 복잡해진다. - 어떨 때 어떤 클래스를 써야 하는지 혼란스럽기도.

 


 

입출력 스트림

 

  • 네트워크에서 자료의 흐름이 물의 흐름과 같다는 비유에서 유래됨
  • 자바는 다양한 입출력 장치에 독립적으로 일관성있는 입출력을 - 입출력 스트림을 통해 제공
  • 입출력이 구현되는 곳 : 파일 디스크, 키보드, 마우스, 네트워크, 메모리 등 모든 자료가 입력되고 출력되는 곳

 

 

입출력 스트림의 구분

 

  • 대상 기준 : 입력 스트림 / 출력 스트림
  • 자료의 종류 : 바이트 스트림 / 문자 스트림
  • 기능 : 기반 스트림 / 보조 스트림

 

대상 기준 

입력용이냐 출력용이냐 구분되어있다. 입출력을 모두 하는 것은 불가능. 입력 - 입력 출력 - 출력 하나만 가능

자료가 들어가는 길이랑 나오는 길은 따로 있다.

 

자료의 종류 

원래는 바이트 단위로 하는 게 기본이다.

but 문자도 많이 사용하니까 문자 단위로 핸들링하는 스트림 만들어줌 (문자는 2바이트~4바이트 까지 사용)

 

기능 

대상이 있을 때 - 직접 I/O 할 수 있는 기능 있는 클래스가 있고- 기반 스트림 

그 외 다른 스트림들은 실제로 읽고 쓰는 기능은 없고 다른 스트림을 감싸줘서 그 스트림이 하는 일에 +@ 해주는 애들이 보조 스트림

( 하나 씩 있는 거를 한꺼번에 읽을 수 있도록 버퍼링 해준다거나  / 바이트로 읽은 거를 문자로 바꿔준다거나 / 오브젝트의 내용을 그대로 저장할 수 있도록 바이트 스트림을 만들어주던가 ) 하는 - 보조 스트림 - 쓰는 방법이 다른 스트림과 다르다.

 

 

스트림 이름으로 - 대상 기준과 자료 종류는 식별 가능  / 기반 - 보조는 이름으로 식별 어렵다.

 

InputStream / Reader -> 입력 스트림

OutputStream / Writer -> 출력 스트림

 

InputStream / OutputStream -> 바이트 스트림

Reader / Writer ->  문자 스트림

 

감싼 애를 또 감쌀 수 있다. - 추가 기능에 추가 기능 가능

이름만 봐서는 구별 어렵다. 

 

 


 

 

  • 입출력 스트림 -  대상 기준 : 입력 스트림 / 출력 스트림

 

입력 스트림과 출력 스트림

 

  • 입력 스트림 : 대상으로부터 자료를 읽어 들이는 스트림
  • 출력 스트림 : 대상으로 자료를 출력하는 스트림

 

 

  • 스트림의 종류
종류 예시
입력 스트림 FileInputStream, FileReader, BufferedInputStream, BufferedReader 등
출력 스트림 FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등

 

InputStream / Reader -> 입력 스트림

OutputStream / Writer -> 출력 스트림

 


 

  • 입출력 스트림 - 자료의 종류 : 바이트 스트림 / 문자 스트림

 

바이트 단위 스트림과 문자 단위 스트림

 

  • 바이트 단위 스트림 : 동영상, 음악 파일, 실행 파일 등의 자료를 읽고 쓸 때 사용
  • 문자 단위 스트림 : 바이트 단위로 자료를 처리하면 문자는 깨짐, 인코딩에 맞게 2바이트 이상으로 처리하도록 구현된 스트림

 

 

  • 스트림의 종류
종류 예시
바이트 스트림 FileInputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream 등
문자 스트림 FileReader, FileWriter, BufferedReader, BufferedWriter 등

 

InputStream / OutputStream -> 바이트

Reader / Writer ->  문자 

 


 

  • 입출력 스트림  - 기능 : 기반 스트림 / 보조 스트림

 

기반 스트림과 보조 스트림

 

  • 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
  • 보조 스트림 : 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림
  • 보조 스트림은 직접 읽고 쓰는 기능은 없으므로 항상 기반 스트림이나 또 다른 보조 스트림을 생성자의 매개 변수로 포함함

 

 

  • 스트림의 종류
종류 예시
기반 스트림 FileInputStream, FileOutputStream, FileReader, FileWriter 등
보조 스트림 InputStreamReader, OutputStreamWriter, BufferedInputStream, BufferedOutputStream 등

 

감싼 애를 또 감쌀 수 있다. - 추가 기능에 추가 기능 가능

이름만 봐서는 구별 어렵다. 

 

 

뒤에서 IO 스트림 - 하나하나 실습해보며 살펴보도록 한다.


 

 

표준 입출력 스트림

 

살펴볼 내용 

1. System 클래스의 표준 입출력 멤버 

  • System.in 살펴보고
  • 보조 스트림 활용으로 한글 자료 읽기

 

2. Byte 단위 입출력 스트림 ( InputStream , OutputStream ) 

  • InputStream - FileInputStream ( 바이트 단위로 자료 읽기 , 배열 단위로 자료 읽기 ) 
  • OutputStream - FileOutPutStream ( 바이트 단위로 쓰기, 배열 단위로  쓰기 )

 


 

System 클래스의 표준 입출력 멤버

 

public class System{ 
	public static PrintStream out; 
	public static InputStream in; 
	public static PrintStream err; 
}

 

  • System.out - 표준 출력(모니터) 스트림         -> System.out.println("출력 메시지");
  • System.in - 표준 입력(키보드) 스트림          -> int d = System.in.read()  // 한 바이트 읽기
  • System.err - 표준 에러 출력(모니터) 스트림  -> System.err.println("에러 메시지");

 

System이라는 클래스 안에 static 변수였던 out 

그래서 new 하지 않고 사용했던 것. System.out.~ System.in~

in 하면 1바이트씩 읽게 된다.

이 부분 먼저 check

 

 

 


 

 

System.in 사용하기 예제

 

read의 반환 값은 int -  i로 받을 거다

System.in.read() 하면 Exception 처리해라 나온다. - try / catch로 잡아주자.

 

 

 


 

엔터 누를 때까지( 라인 바뀌기 전까지 ) 반복하도록 while 문 추가

 

 

 

알파벳은 잘 나오는데 한글은 깨져서 나온다

-> System.in 은 한 바이트씩 읽는데 - 한글은 2바이트씩 캐릭터 set에 맞게 해 줘야 되는데 안돼서 깨짐

 

 

System.in - InputStream - 보조 스트림으로 감싸줘야 된다.

 

 


 

 

보조 스트림으로 감싸주기

 

  

 

 

try 문 안에 System.in을 감싸는 보조 스트림 InputStreamReader 추가

이 InputStreamReader 형으로 만든 변수 irs로 사용

 

한글도 안 깨지고 출력됨을 확인

 

지금은 System.in을 감쌌지만, 파일을 감싸게 되면 파일에 있는 한글들을 읽을 수 있는 것이다.

 

 


 

review

I/O 스트림, IO스트림의 구분, 표준 입출력 스트림
자바는 다양한 입출력 장치 - (키보드, 마우스, 모니터, 네트워크 출력 등)에
독립적으로 일관성 있는 입출력을 ---> 입출력 스트림을 통해 제공한다.
입출력 스트림은 대상에 따라 입력 스트림 / 출력 스트림 구분하고
자료의 종류에 따라 바이트 스트림 / 문자 스트림
기능에 따라 기반 스트림/ 보조 스트림으로 구분한다.

표준 입출력 스트림으로는 System.out / System.in / System.err 가 있다.
표준 출력(모니터) 스트림 / 표준 입력(키보드) 스트림 / 표준 에러 출력(모니터) 스트림

다양한 디바이스로부터 입력과 출력이 들어오고 나가는데
이를 독립적으로 일관되게 도와주는 것이 IO 스트림!
IO스트림에는 무엇이 있는지 표준 스트림에는 무엇이 있는지 배웠다.
뒤에서 대표적인 것들 예제로 실습하며 살펴볼 예정!

그동안 많이 사용했던 System.out과 System.in
알고 보니
표준 출력 스트림이란 녀석이었다.
 IO스트림의 종류가 너무나 많은 것을 보고 놀랐다.
다 사용해보기는 어렵고 어떻게 사용하는지 어떤 원리 인지 익히는 것이 목표
나중에 IO스트림 사용할 상황이 생기면 그 상황에 맞는 IO스트림 적용할 수 있도록!