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
를 고려한다면, 연결 클라이언트 수가 많고 전송되는 데이터 용량이 적으면서 입출력 작업 처리가 빨리 끝나는 경우 선택하기