*JAVA*

[java] IO 스트림

깐부로부터 2021. 11. 18. 02:29

java.io. 패키지에 존재

프로그램 상의 데이터를 외부매체(모니터, 스피커, "파일")로 출력하거나
입력장치(키보드, 마우스, 마이크, "파일")로 입력받는 과정
=> IO(Input & OutPut, 입출력)

 

IO를 진행하고 싶다면
우선적으로 "반드시" 프로그램과 외부매체와의 "통로"를 만들어야한다.
=> "스트림" (Stream)

 

스트림의 특징
- 단방향 : 입력이면 입력, 출력이면 출력
입력용 스트림 따로, 출력용 스트림이 따로 존재
동시에 입출력을 하고자 한다면?
-> 하나의 스트림으로는 불가능!!!
-> 입력, 출력 스트림 둘다 갖고있어야함
 
- 선입선출(FIFO) : 먼저 전달한값이 먼저 나오게됨 (먼저들어간놈이 먼저 나온다.) => 큐(Queue)
(순서대로 들어가서 나온다.)
시간지연 문제가 발생할 수 있다.

 

 

 

- 바이트 기반 스트림 : 1Byte 짜리가 이동할 수 있는 좁은 통로

 : 그림, 멀티미디어, 문자등 모든 종류의 데이터를 받고 보낼 수 있다.

입력(XXXInputStream) /  출력(XXXOutputStream)

 

- 문자 기반 스트림 : 2Byte 짜리가 이동할 수 있는 넓은 통로

 : 문자만 받고 보낼 수 있도록 특화되어 있다.

입력(XXXReader) / 출력 (XXXWriter)

 

 

- 외부매체와의 직접적인 연결 여부

기반 스트림 : 외부 매체와 직접적으로 연결되는 통로
보조 스트림 : 기반 스트림만으로 부족한 성능을 향상시켜주는 용도의 스트림
=> 단독 사용 불가(기반스트림을 만들고 추가해주는 용도)
=> 속도향상, 자료형에 맞춰서 변환, 객체 단위로 입출력하게 도움

 


<바이트 스트림>

 

InputStream

바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.

 

*주요 메소드*

- int read() : 입력 스트림으로부터 1바이트를 읽고 읽은 바이트를 리턴한다.

(int형은 4byte지만 4byte끝에 1byte 반환돼서 저장된다고 생각해라.) 

 

- int read(byte[] b) : 입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트에 배열 b에 저장하고 실제로

읽은 바이트 수를 리턴한다.

 

- int read(byte[] b, int off, int len) : 입력 스트림으로부터 len 개의 바이트 만큼 읽고 매개값으로 주어진 바이트 배열  b[off] 부터 len개가지 저장한다. 그리고 실제로 읽은 바이트 수인 len 개를 리턴. 만약 len 개를 모두 읽지 못하면 실제로 읽은 바이트 수를 리턴한다.

 

- void close() : 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다.

  ★닫지 않으면 지금 당장은 아니더라도 차후에 문제될 여지가 있다

 

 

※ 한글은 2Byte이기 때문에 깨져서 저장됨
    바이트 스트림으로는 불가능하다!
    문자 스트림을 쓰면 해결가능!!

 

 

 

 

 

 

OutputStream

바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스이다.

 

*주요 메소드*

- void write(int b) : 출력 스트림으로 1byte를 보낸다.

 

- void write(byte[] b) :  출력 스트림에 매개값으로 주어진 바이트 배열 b의 바이트를 보낸다.

 

- void write(byte[] b, int off, int len) : 출력 스트림에 매개값으로 주어진 바이트 배열 b[off]에서부터 len개까지 바이트를 보낸다.

 

- void flush() : 버퍼에 잔류하는 모든 바이트를 출력한다.

 

- void close() : 사용한 시스템 자원을 반납하고 출력 스트림을 닫는다.

 

 


<문자 스트림>

 

Reader

문자 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.

 

*주요 메소드*

- int read() : 입력 스트림으로부터 한개의 문자를 읽고 리턴

 

- int read(char[] cbuf) : 입력 스트림으로부터 읽은 문자들을 매개값으로 주어진 배열  cbuf에 저장하고 실제로 읽은 문자수를 리턴한다.

 

- int read(char[] cbuf, int off, int len) : 입력 스트림으로부터 len 개의 문자를 읽고 매개값으로 주어진 문자 배열 cbur[off] 부터 len 개가지 저장한다.그리고 실제로 읽은 문자 수인 len개를 리턴한다.

 

- void close() : 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다.

 

 

"D:\안소영\test.txt 파일안에 "자바"라고 저장이 되어있는 것을 2byte씩 읽어와서 콘솔창에 출력해준다.

 

 

 

Writer

문자 기반 출력 스트림의 최상위 클래스로 추상 클래스이다.(객체 생성 불가)

 

- void write(int c) : 출력 스트림으로 매개값으로 주어진 한 문자를 보낸다.

 

- void write(char[] cbuf) : 출력 스트림에 매개값으로 주어진 문자 배열 cbuf에 문자를 보낸다.

 

- void write(char[] cbuf, int off, int len) : 출력 스트링에 매개값으로 주어진 문자 배열 cbuf에 [off]부터 len개까지의 문자를 보낸다.

 

- void write(String str) : 출력 스트림에 매개값으로 주어진 문자열을 전부 보낸다.

 

- void write(String str, int off, int len) : 출력 스트림에 매개값으로 주어진 문자열 off순번부터 len개까지 문자를 보낸다.

 

- void flush() : 바이트 스트림이랑 이하동문

 

- void close() : 역시 바이트 스트림이랑 이하동문

 

 

write() 메소드실행으로 "D:\안소영\test.txt에 문자열 "홍길동"이 출력되게 되었다.


<보조 스트림>

 

BufferedReader / BufferedWriter
=> 버퍼공간을 제공해서 한번에 모아뒀다가 한꺼번에 입출력 진행
=> 속도 향상 목적의 보조 스트림 (BufferedXXX)

[표현법]
보조스트림클래스이름 객체이름 = new 보조스트림클래스이름(기반스트림객체);
=> 보조스트림은 단독으로 존재할 수 없기 때문에!!!

 

- 기반스트림Input/Output 계열일 경우
  보조스트림Input/Output 계열을 사용


- 기반스트림Reader/Writer 계열일 경우
  보조스트림Reader/Writer 계열을 사용

 

 

※ BufferedReader를 사용하게 되면 readline()을 사용할 수 있게된다.

readLine() : 입력한 한 행을 한꺼번에 읽는 메소드 (한줄 전체를 읽기위해 많이들 사용)

 

 

 

BufferedWriter : 버퍼공간을 제공해서 한꺼번에 출력을 진행하겠다.

 

 

 

 

실수로 자원반납을 까먹는다면?
누가 대신 close좀 해주면 안되나?

 * try ~ with ~ resource 구문 
 *  - JDK7 버전 이상부터 가능
 *  
 *  [표현법]
 *  try(스트림객체생성;){
 *   예외가 발생할법한 구문
 *  }
 *  catch(예외클래스이름 e){
 *  
 *  }
 *  
 *  - 스트림객체를 try(여기!!!!!!!!)에 넣어버리면
 *   스트림객체를 생성 후 해당 블록의 구문이 실행 완료되면
 *   알아서 자원 반납이 된다.
 *  
 *  - 선언부분도 같이!
 *  - 객체 생성을 여러개 할 경우 마지막 생성부는 ; 붙여되고
 *  안붙여도 된다.

 

 

'*JAVA*' 카테고리의 다른 글

[java] Wrapper(래퍼) 클래스  (0) 2021.11.20
[java] 컬렉션 프레임웍(Collections Framework)  (0) 2021.11.19
[java] API - java.lang 패키지  (0) 2021.11.16
[java] 예외(Exception)  (0) 2021.10.30
[java] 인터페이스(Interface)  (0) 2021.10.29