java.nio는 데이터, 파일의 읽고 쓰기가 향상된 기능을 제공함으로써 전통적인 IO의 성능 문제를 개선하기 위한 패키지이다.
| 구분 | IO | NIO |
|---|---|---|
| 입출력 방식 | 스트림 방식 | 채널 방식 |
| 버퍼 방식 | 넌버퍼 | 버퍼 |
| 비동기 방식 | 지원X | 지원O |
| 블로킹/넌블로킹 | 블로킹 방식만 지원 | 둘 다 지원 |
IO는 스트림(Stream)
IO의 입출력 방식은 스트림 방식이다. 스트림은 데이터를 읽거나 출력하기 위한 입력 스트림, 출력 스트림을 별도로 생성해야 한다.단방향으로 전송된다.NIO는 채널(Channel)
양방향으로 가능하기 때문에 별도로 입력과 출력을 위한 채널을 만들 필요가 없다.IO는 넌버퍼(Non-Buffer)
1Byte씩 읽고 출력하기 때문에 대체로 느리다.BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter와 같은 보조 스트림을 별도로 사용하기도 한다.NIO는 버퍼(Buffer)
IO는 동기
IO의 API를 호출하게 되면 그 API가 작업을 다 끝내야 다음 코드로 실행이 가능하다.NIO는 동기/비동기 모두 지원
NIO의 API를 호출하고 나서 다른 작업이 가능하다.IO는 블로킹 방식
read()를 호출하면 데이터가 입력되기 전까지 스레드는 블로킹(대기상태)된다.write()를 호출하면 데이터가 출력되기 전까지 스레드는 블로킹된다.NIO는 블로킹/넌블로킹 모두 지원
IO 블로킹과의 차이점은 NIO 블로킹은 스레드를 interrupt로 빠져 나올 수 있다.NIO는 넌블로킹은 입출력 작업 준비가 완료된 채널만 선택해서 스레드가 처리하기 때문에 작업 스레드가 블로킹되지 않는다.NIO의 넌블로킹의 핵심 객체는 멀티플렉서(multiplexor)인 셀렉터(Selector)이다. 셀렉터는 복수 개의 채널 중에서 준비완료된 채널을 선택하는 방법을 제공한다.NIO가 IO보다 성능이 훨씬 좋지만 상황에 따라 IO는 더 좋은 성능을 보일 수도 있다.IO를 고려한다면, 연결 클라이언트 수가 적고 전송되는 데이터가 대용량이면서 순차적으로 처리될 필요성이 있을 경우 선택하기NIO를 고려한다면, 연결 클라이언트 수가 많고 전송되는 데이터 용량이 적으면서 입출력 작업 처리가 빨리 끝나는 경우 선택하기