【转】什么是Java NIO,它的工作原理是什么?
这次为大家介绍的是Java NIO的相关知识,告诉大家什么是NIO,它的工作原理是什么。
NIO是为了弥补传统I/O工作模式的不足而研发的,NIO的工具包提出了基于Selector(选择器)、Buffer(缓冲区)、Channel(通道)的新模式;Selector(选择器)、可选择的Channel(通道)和SelectionKey(选择键)配合起来使用,可以实现并发的非阻塞型I/O能力。
先来看一下NIO工具包的三个组成部分都是什么?
1. Selector(选择器)和SelectionKey(选择键)
Buffer是数据的容器对象;Channel实现在Buffer与I/O服务间传输数据。Selector是实现并发型非阻塞I/O的核心,可选择的通道将其感兴趣的事件注册到Selector对象上,Selector不断轮询监视着注册在其上的Socket通道。SelectionKey类封装了SelectableChannel对象在Selector中的注册信息。当Selector监测到在某个注册的SelectableChannel上发生了感兴趣的事件时,会自动激活产生一个SelectionKey对象,在该对象中记录了哪个SelectableChannel上发生了哪种事件,通过对被激活的SelectionKey的分析,外界可以知道每个SelectableChannel发生的具体事件类型,进行相应的处理。
2. Buffer(缓冲器)
Buffer类是一个抽象类,它有7个子类分别对应七种基本的数据类型:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer和ShortBuffer。每一个Buffer对象相当于一个数据容器,可以把它看作内存中的一个大的数组,用来存储和提取所有基本类型(boolean型除外)的数据。Buffer类的核心是一块内存区,可以直接对其执行与内存有关的操作,利用操作系统特性和能力提高和改善Java传统I/O的性能。
3. Channel(通道)
Channel被认为是NIO工具包的一大创新点,是Buffer(缓冲器)和I/O服务和之间的通道,具有双向性,既可以写入也可以读出,可以更高效地传递数据。我们这里主要讨论ServerSocketChannel和SocketChannel,它们都继承了SelectableChannel,是可选择的通道,分别可以工作在同步和异步两种方式下(这里的可选择不是指可以选择两种工作方式,而是指可以有选择地注册自己感兴趣的事件)。当通道工作在同步方式时,它的功能和编程方法与传统的ServerSocket、Socket对象相似;当通道工作在异步工作方式时,进行输入输出处理不必等到输入输出完毕才返回,并且可以将其感兴趣的事件(如:接受、连接、读出、写入等操作)注册到Selector对象上,与Selector对象协同工作可以更有效率地支持和管理并发的网络套接字连接。
NIO的工作原理是什么?
在并发型服务器程序中使用NIO,实际上是通过网络事件驱动模型实现的。我们应用Select机制,不用为每一个客户端连接新启线程处理,而是将其注册到特定的Selector对象上,这就可以在单线程中利用Selector对象管理大量并发的网络连接,更好的利用了系统资源;采用非阻塞I/O的通信方式,不要求阻塞等待I/O操作完成即可返回,从而减少了管理I/O连接导致的系统开销,大幅度提高了系统性能。
当有读或写等注册事件发生时,可以从Selector中获得相应的SelectionKey,从SelectionKey中可以找到发生的事件和该事件所发生的具体的SelectableChannel,以获得客户端发送过来的数据。由于在非阻塞网络I/O中采用了事件触发机制,处理程序可以得到系统的主动通知,从而可以实现底层网络I/O无阻塞、流畅地读写,而不像在原来的阻塞模式下处理程序需要不断循环等待。使用NIO,可以编写出性能更好、更易扩展的并发型服务器程序。
并发型服务器程序的实现代码:应用NIO工具包,基于非阻塞网络I/O设计的并发型服务器程序与以往基于阻塞I/O的实现程序有很大不同,在使用非阻塞网络I/O的情况下,程序读取数据和写入数据的时机不是由程序员控制的,而是Selector决定的。
使用非阻塞型I/O进行并发型服务器程序设计分三个部分:1. 向Selector对象注册感兴趣的事件;2.从Selector中获取所感兴趣的事件;3. 根据不同的事件进行相应的处理。
在进行并发型服务器程序设计时,通过合理地使用NIO工具包,就可以达到一个或者几个Socket线程就可以处理N多个Socket的连接,大大降低我们对服务器程序的预算压力。同时我们利用它更好地提高系统的性能,使我们的工作得到更加有效地开展。