1.前言缓存
在看书的时候,看到了Nio。这时候我去学习了Nio的相关知识,以及和io的区别,这两个什么时候该使用。学习
2.Nio和Io的区别线程
上老图:3d
由图可知,Nio是面向缓冲的,Io是面向流的blog
2.1读取:input
对于Io是经过流每次读取一个字节,写也是每次写入一个字节筛选出 。若是想再读一次,或者从中间读,就必须先把流中的数据保存一份。对于Nio必须先将inputstream等流先写到缓存区(buffer)。这个时候你能够任意的使用这个buffer,以及从任意位置开始读取。it
2.2 阻塞与非阻塞io
Java的Io是阻塞的,当线程调用read()或者write()方法时,该线程会被阻塞,直到这个io操做完成为止。只有完成这个操做,这个线程才能作其余的事情。stream
Java的NIo想了一个好的方法来作到非阻塞。他用到了selector,channel和buffer。当一个线程到通道channel中请求读取数据的时候,仅能读取到目前channel写入的数据。由于是非阻塞的缘由,客户端在读取的时候要本身判断是否已经所有写入完成。同时,若是没有数据,不会阻塞,客户端会立马接收到null,客户端线程能够去作其余的事情,而不用等待。select
Nio就是使用少数的线程来做为selector,设置为非阻塞,而后指定端口,这些线程就能够接受大量的客户端链接来处理流。每当有一个客户端链接的时候,就会有一个channel注册到selector上,他们会根据一个key来本身创建联系,直到流写入完成,key失效为止。
2.3 线程链接数
总而言之,
当有大量链接,可是每一个链接传输的流比较小的时候,适合使用NIo;
当只有少许链接,可是一个链接会有大量数据传输的时候,适合使用Io(一个链接,一个线程);
3 Nio详细
NIo是经过一个无限循环来不断轮询selector是否有注册上来的channel。同时每一个注册上来的channel都是有不一样的状态,分别为connection,accept,read,write。每经过一个状态,会从新往selector从新注册一个channel,这也是为何客户端在读取数据的时候,须要作是否已经写入完毕的判断。一旦selector拿到数据,他会返回全部和他创建链接的channel的key,并经过这个key和状态作相应的操做。
4 之后
Nio还在初步学习阶段,后续再完善了!
如有错误,恳请指正,万分感谢!!!