首先纠正一个观点,
NIO的目的不是在单个IO的时候快过普通I/O,而是在并发多个I/O的时候减少线程的使用量,从而提高整个系统的可伸缩性,因此主要用于提高并发处理的能力(能同时服务于更多的客户,而资源消耗最小),而不是提升速度.
Nonblocking I/O is primarily relevant to network connections. Pipe channels that move data between two threads also support nonblocking I/O. File channels don't support it at all because file access doesn't block nearly as often as network channels do, and most modern disk controllers can fill a CPU with data fast enough to keep it satisfied. Furthermore, it's uncommon for one program to read or write hundreds of files simultaneously. However, on network servers, this usage pattern is the rule, not the exception.(来自Java™ I/O, 2nd Edition)
主要包:
java.nio
定义了Buffer及其数据类型相关的子类。其中被java.nio.channels中的类用来进行IO操作的ByteBuffer的作用非常重要。
java.nio.channels
定义了一系列处理IO的Channel接口以及这些接口在文件系统和网络通讯上的实现。这个包通过Selector和SelectableChannel这两个类,还定义了一个进行异步(non-blocking)IO操作的API,这对需要高性能IO的应用非常重要。这个包可以说是NIO API的核心。
java.nio.channels.spi
定义了可用来实现channel和selector API的抽象类。
java.nio.charset
定义了处理字符编码和解码的类。
java.nio.charset.spi
定义了可用来实现charset API的抽象类。
java.nio.channels.spi和java.nio.charset.spi这两个包主要被用来对现有NIO API进行扩展,在实际的使用中,我们一般只和另外的3个包打交道。
详细API讲解参见http://dev.csdn.net/article/58/58120.shtm
反应器模式(Reactor pattern)
NIO 设计背后的基石是反应器设计模式。 分布式系统中的服务器应用程序必须处理多个向它们发送服务请求的客户机。然而,在调用特定的服务之前,服务器应用程序必须将每个传入请求多路分用并分派到各自相应的服务提供者。反应器模式正好适用于这一功能。它允许事件驱动应用程序将服务请求多路分用并进行分派,然后,这些服务请求被并发地从一个或多个客户机传送到应用程序。
反应器模式的核心功能:
将事件多路分用
将事件分派到各自相应的事件处理程序
Selector机制
Selector是一个“多路复用器”,负责统一各个处理程序的消息注册,统一接收客户端或服务器消息信息,再分发给不同的事件处理程序进行处理。整个流程就一个注册->接收->处理的过程.
Selector作为一个枢纽中心目的就是为高效复用提供基础,开过多Selector基本说明设计或使用上存在问题,这篇文章详细分析了selector机制。(http://blog.csdn.net/haoel/archive/2008/03/27/2224055.aspx)
相关资料
http://rox-xmlrpc.sourceforge.net/niotut/index.html
指出了一些设计原则和一个基于NIO的C/S程序。
http://onjava.com/onjava/2002/09/04/nio.html