简单理解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里面读取数据

原文地址:https://www.cnblogs.com/xulibing/p/9516793.html