简单理解io与nio
io是面向流的,而nio是面向缓冲区的;
io每次从流中读取一个或者多个字节,直到读取完所有的字节,这就意外着它是阻塞式的,当一个线程执行read或者write的时候,这个线程是不能够再去做其他的事情了;
nio会读取数据放到一个缓冲区里,这样可以增加读取数据的灵活性,可以前后移动读取数据的位置,它是非阻塞的,它大概由以下组成部分:
channel即通道、buffer即缓冲区、selector即选择器
channel可以是单向通道也可以是双向通道,双向通道实现了读和写的接口,单向通道只实现了其中的一个;需要注意的是,通过FileInputStream获取的channel虽然实现了读写两个接口,
但是由于FileInputStream是以读文件的权限打开文件的,所以这个时候执行write方法的时候是会抛出异常的;
可以以一个简单的生活例子来形容nio:
三两个好友一起去餐厅吃饭,坐下来的时候,招手叫服务员过来点菜,点完菜之后服务员在前台会有一张单记录是哪个餐桌点了哪些菜,然后就开始让师傅去做菜,三两个好友在等菜上来的这段时间,
可以吹吹水,闲聊人生,亦或者可以摇色子,喝喝酒,等到菜烹饪好了的时候,师傅端着菜过来问服务员是哪个桌子的菜,服务员查看了记录单之后确定了是那张桌子的菜,告诉师傅端过去了,等菜上了的时候,
三两个好友停下了摇色子之类的事,开始吃饭了。
这是生活中一个很简单又贴切的例子,解释一下:记录单就相当于是selector,服务员就相当于selector的轮询线程,三两个好友点菜就相当于向selector注册事件,
总结起来就是:
假设现在有个客户端和服务端建立了双向的channel,以服务端为例,它会向selector注册读和写事件,selector会有一个单独的线程去轮询,看看是否有可用的时间到达,如果有则执行事件,比如现在客户端向
服务端发送了数据,selector的线程会找到读事件,然后就开始从buffer里面读取数据