我对NIO的理解
NIO解决了两个阻塞问题:(1)IO本身的阻塞 (2)sockect.的accept阻塞;解决方案分别是新IO里面的channel/bytebuffer和selector.
问题1:
首先传统的IO是基于流的,是阻塞的,因为假设在网络应用中,如果数据没有到位(没有数据,或者不够:例如一个字节只传了第一位),而又不是流的结束(连接中断),那么这个时候线程会阻塞。
那么假设我们用装饰类bufferinputstream之类,是否解决了这个问题呢?其实并没有,因为理由有2个:
(1)装饰肯定以原来的inputstream为基础,既然基础的是阻塞的,那么必然也是阻塞的;
(2)例如BufferedReader.readline(),只是等于数据满足一行(遇到换行符)时,才会读出,减少不断读的代价,反而增大了要求;
从上面可以看出,传统的IO是阻塞的,那么只能借助于NIO来解决这个问题:
NIO用通道(这样仅仅是数据而已了)取代了流(字节流或者字符流),最大的特性是无阻塞的,即通道里面有多少数据就读写多少,立即返回,而不是阻塞。
(1)即使数据没有全部到位,也可以读写。
问题2:
然后通过selector来监听通道收听感兴趣的数据,如果有数据,这个时候可以去读或者写,这样解决了ACCEPT的阻塞:
(1)不用像传统的那样去死等数据来,监听到才通知读;
不知道自己理解的对不对?