从Java 1.4开始,为提升Java IO的效率,提供了Java NIO相关API。该API细分了IO请求与IO的实际执行,从而使得线程可以更高效得并行执行。
Java 1.7彻底解决了线程发出IO请求后的阻塞问题,也被称为NIO 2.0。
1. Java IO的实现方式
- 阻塞的BIO
- 同步非阻塞的NIO(JDK4)
但是IO请求实际上是通过select系统调用发出的,而select系统调用是阻塞的,所以线程其实还是要等待select系统调用的返回。
IO处理完毕后,select系统调用返回,线程取到IO请求的数据,继续进行其他处理。
- 异步非阻塞的AIO(NIO2.0, JDK7)
2. Java IO与NIO的比较
IO面向的是数据流,NIO面向的是数据缓存(即通道);
IO请求往往阻塞,NIO请求往往非阻塞(发出请求后去处理其他通道);
NIO通过为通道设置选择器,一个线程可以同时处理多个通道;
NIO处理的结果,通过Watcher注册的事件监听,监听的事件发生即唤醒选择器,继续当前通道的处理。