- NIO与IO的最大区别就是:当读取数据的时候,NIO读取之后需要缓冲,是面向缓冲区的,而IO不需要缓冲,是面向流的。
- IO是阻塞的:就意味着当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不会做任何事情。
- NIO的非阻塞模式,使一个线程从某通道发送请求数据,但是它仅能得到目前可用的数据,如果没有适用的数据,就不会读取数据,而不是保持线程阻塞。线程通常将非阻塞IO的空闲时间用于在其他执行IO操作,所以一个单独的线程可以管理多个输入和输出通道。
- java NIO选择器允许一个单独的线程来监视多个输入通道。
NIO和IO如何影响应用程序的设计
-
API调用,NIO读取数据时,必须先到缓存中再做处理。
-
数据处理:
NIO处理数据:当数据全部到缓冲区时,就是当缓冲区满时,才能处理数据,如何判断缓存区已经满了呢?或者如何直到数据已经全部到达缓冲区了呢?我们需要判断,需要扫面缓冲区。其实很多情况下,我们获取部分数据就能开始处理,但是这样的情况,阻碍了我们处理。
- 用来处理数据的线程数。NIO可以使用一个单独的线程来管理多个通道,但付出的代价就是解析数据可能会比从一个阻塞流中读取数据更复杂。如果需要管理成千上万的链接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出战连接,可能时一个优势。
- 如果你有少量的连接使用非常的宽带,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。