반응형
목표
자바의 Input과 Ontput에 대해 학습하세요.
학습할 것 (필수)
- 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
- InputStream과 OutputStream
- Byte와 Character 스트림
- 표준 스트림 (System.in, System.out, System.err)
- 파일 읽고 쓰기
입출력이란?
입출력(I/O)이란 Input 과 Output의 약자로 입력과 출력을 말한다.
즉, 컴퓨터 내부 또는 외부 장치와 프로그램간의 데이터를 주고받는 것을 말한다.
예) 키보드로 데이터 입력받기, System.out.println()
을 이용해 화면에 출력하기
스트림, 버퍼, 채널 기반의 IO
스트림
- FIFO
- 단방향이라 입력 스트림과 출력 스트림을 별도로 해야한다.
- 연속된 데이터 흐름으로 입출력 진행시, 다른 작업을 못하는 블로킹 상태가 된다.
- 입출력 대상을 변경하기 편하다.
자바의 NIO(New IO)
- 자바의 1.4버전부터 추가된 API 로 논블로킹 처리가 가능하며, 스트림이 아닌, 채널을 사용한다.
버퍼
- byte, char, int 등 기본 데이터 타입을 저장할 수 있는 저장소로, 배열과 마찬가지로 제한된 크기에 순서대로 데이터를 저장한다.
- 버퍼는 데이터를 저장하기 위한 것이지만, 실제로 버퍼가 사용되는 것은 채널을 통해 데이터를 주고받을 때 쓰인다.
- 채널을 통해 소켓, 파일 등에 데이터를 전송할 때나 읽어올 때, 버퍼를 사용하게 됨으로 가비지량을 최소화를 시킬 수 있게 되며, 이는 가비지 콜렉션 회수를 줄여 서버의 전체 처리량을 증가시켜준다.
IO vs NIO
- IO 방식으로 각각의 스트림에서 read() 와 write() 가 호출이 되면, 데이터가 입력되고, 데이터가 입력되고, 데이터가 출력되기 전까지, 스레드는 블로킹상태가 된다. (= 작업이 끝날때까지 기다려야한다. = 해당 스레드가 사용 불가가된다. = 인터럽트도 안된다. = 닫기를 제외한 아무 방법이 없다.)
- NIO 의 블로킹 상태에서는 Interrupt 를 이용해 빠져나올 수 있다.
구분 | IO | NIO |
---|---|---|
입출력 방식 | 스트림 | 채널 |
버퍼 방식 | Non Buffer | Buffer |
비동기 방식 지원 | x | o |
블로킹/논블롱킹 방식 | 블로킹만됨 | 둘 다 |
사용 케이스 | 연결 클라이언트가 적고 IO가 큰 경우(대용량) |
연결 클라이언트가 많고 IO 처리가 작은 경우(저용량) |
InputStream 과 OutputStream
InputStream
- 바이트 기반 입력스트림의 최상위 추상 클래스
- 모든 바이트 기반 입력 스트림은 이 클래스를 상속받아서 만들어진다.
- 버퍼, 파일, 네트워크단에서 입력되는 데이터를 읽어오는 기능을 수행한다.
메소드 | 설명 |
---|---|
read() | 입력 스트림으로부터 1바이트를 읽어서 바이트를 리턴 |
read(byte[] b) | 입력스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열 b에 저장하고 실제로 읽은 바이트 수를 리턴 |
read(byte[] b, int off, int len) | 입력스트림으로부터 len개의 바이트만큼 읽고 매개값으로 주어진 배열 b[off] 개 부터 len개 까지 저장. 그리고 실제로 읽은 바이트 수만큼인 len개를 리턴, 만약 len개를 모두 읽지 못하면, 실제로 읽은 바이트 수를 리턴 |
close() | 사용한 시스템 자원을 반납하고 입력 스트림 닫기 |
OutputStream
- 바이트 기반 출력 시스템의 최상위 추상 클래스
- 모든 바이트 기반 출력 스트림은 이 클래스를 상속받아서 만들어진다.
- 버퍼, 파일, 네트워크단으로 데이터를 내보내는 기능을 수행한다.
메소드 | 설명 |
---|---|
write(int b) | 출력 스트림으로부터 1바이트를 보낸다.(b 의 끝 1바이트) |
write(byte[] b) | 출력 스트림으로부터 주어진 바이트 배열 b 의 모든 바이트를 보낸다. |
write(byte[] b, int off, int len) | 출력 스트림으로 주어진 바이트 배열 b[off] 부터 len 개 까지의 바이트를 보낸다.ㅂ |
flush() | 버퍼에 잔류하는 모든 바이트를 출력한다. |
close() | 사용한 시스템 자원을 반납하고 입력 스트림 닫기 |
byte 와 Character 스트림
Byte Stream
- binary 데이터를 입출력하는 스트림
- 데이터는 1바이트 단위로 처리
- 이미지, 동영상 등을 송수신할 때 사용
보조 스트림
- FilterInputStream 과 FilterOutputStream 을 상속받는 클래스들로 기본 스트림과 결합하여 특정 상황에서 보다 편리하게 사용할 수 있다.
- BufferedInputStream/BufferedOutputStream : 버퍼를 사용해 입출력의 효율과 편의를 위해 사용한다.
- BufferedReader/ BufferedWriter: 라인 단위의 입출력이 편리하다.
- InputStreamReader /OutputStreamReader : 바이트 스트림을 문자 스트림처럼 쓸 수 있게 하며, 문자 인코딩 반환을 지원한다.
- DataInputStream / DataOutputStream : 자바 원시자료형 데이터 처리에 적합하다.
표준 스트림(System.in, System.out, System.err)
-
표준 입출력 스트림의 종류는
java.lang
패키지의 System 클래스 내부에 static 으로 선언되어있으며 다음과 같다.public final class System{ public static final InputStream in; public static final OutputStream out; public static final PrintStream err; }
- System.out 은 콘솔 화면에 문자열을 출력하기 위한 용도로 사용되는 출력 스트림이다.
- System.in 은 키보드의 입력을 받아들이기 위해 사용하는 입력 스트림이다.
- System.out 과 System.err
- 둘 다 출력 스트림이다.
- err 은 버퍼링을 지원하지 않는다. 이것이 err보다 정확하고 빠르게 출력돼야하기 때문이라 한다. 버퍼링을 하던 도중, 프로그램이 멈추면, 버퍼링 된 내용이 출력되지 않아서 이다.
파일의 읽고 쓰기
- 텍스트 파일의 경우, 문자 스트림 클래스를 사용하면 되고, 바이너리 파일인 경우, 바이트 스트림을 기본적으로 사용한다.
- 입출력 효율을 위해 Buffered 계열의 보조 스트림을 함께 사용하는게 좋다.
참고 문헌
https://bingbingpa.github.io/java/whiteship-live-study-week13/
반응형
'스프링, 자바' 카테고리의 다른 글
자바의 단점 , 보일러 플레이트 (0) | 2021.02.25 |
---|---|
java Reflection (0) | 2021.02.22 |
자바의 맵 (0) | 2021.02.19 |
자바의 애노테이션 (0) | 2021.02.06 |
자바의 제네릭 (2) | 2021.02.03 |