자바 4부터 새로운 입출력(NIO: New Input/Output)이라는 뜻에서
java.nio
패키지가 포함되었는데, 자바 7로 버전업하면서 자바 IO와 NIO 사이의 일관성 없는 클래스 설계를 바로 잡고, 비동기 채널 등의 네트워크 지원을 대폭 강화한 NIO.2 API가 추가되었다.
java.nio2
패키지로 제공되지 않고 java.nio
의 하위 패키지(java.nio.channels
, java.nio.charset
, java.nio.file
)에 통합되어 있다. NIO
와 NIO.2
를 구별하지 않고 그냥 NIO
로 부르기로 하겠다.NIO 패키지 | 포함되어 있는 내용 |
---|---|
java.nio | 다양한 버퍼 클래스 |
java.nio.channels | 파일 채널, TCP 채널, UDP 채널 등의 클래스 |
java.nio.channels.spi | java.nio.channels 패키지를 위한 서비스 제공자 클래스 |
java.nio.charset | 문자셋, 인코더, 디코더 API |
java.nio.charset.spi | java.nio.charset 패키지를 위한 서비스 제공자 클래스 |
java.nio.file | 파일 및 파일 시스템에 접근하기 위한 클래스 |
java.nio.file.attribute | 파일 및 파일 시스템의 속성에 접근하기 위한 클래스 |
java.nio.file.spi | java.nio.file 패키지를 위한 서비스 제공자 클래스 |
IO와 NIO는 데이터를 입출력한다는 목적은 동일하지만, 방식에 있어서 크게 차이가 난다.
구분 | IO | NIO |
---|---|---|
입출력 방식 | 스트림 방식 | 채널 방식 |
버퍼 방식 | 넌버퍼(non-buffer) | 버퍼(buffer) |
비동기 방식 | 지원 안함 | 지원 |
블로킹/넌블로킹 방식 | 블로킹 방식만 지원 | 블로킹/넌블로킹 방식 모두 지원 |
IO는 스트림 기반이다.
FileInputStream
과 FileOutputStream
을 별도로 생성해야 한다.NIO는 채널 기반이다.
FileChannel
하나만 생성하면 된다.IO는 출력 스트림이 1바이트를 쓰면 입력 스트림이 1바이트를 읽는다.
BufferedInputStream
, BufferedOutputStream
을 연결해서 사용하기도 한다. NIO는 기본적으로 버퍼를 사용해서 입출력을 하기 때문에 IO보다는 입출력 성능이 좋다.
IO는 블로킹된다.
read()
메소드를 호출하면 데이터가 입력되기 전까지 스레드는 블로킹(대기 상태) 된다.write()
메소드를 호출하면 데이터가 출력되기 전까지 스레드는 블로킹된다.interrupt
)도 할 수 없다. 블로킹을 빠져나오는 유일한 방법은 스트림을 닫는 것이다. NIO는 블로킹과 넌블로킹 특징을 모두 가지고 있다.
작업 준비가 완료되었다
는 것은 지금 바로 읽고 쓸 수 있는 상태를 말한다. 멀티플렉서(multiplexor)
인 셀렉터(Selector)
이다. 네트워크 프로그램을 개발할 때 IO와 NIO 선택 기준에 대해 생각해보자!
NIO는 연결 클라이언트 수가 많고, 하나의 입출력 처리 작업이 오래 걸리지 않는 경우, IO는 연결 클라이언트 수가 적고, 전송되는 데이터가 대용량이며 순차적으로 처리될 필요성이 있을 경우에 적합하다.
이것이 자바다 책