javanio:java nio本质与精要

NIO之关键:
1.数据缓冲(Buffer)处理
数据缓冲是IO操作的基本元素.从本质上来说,无论是磁盘还是网络IO,应用程序所作的所有事情就是把数据放到相应的数据缓冲当中去(写操作),或者从相应的数据缓冲中提取数据(读操作).至于数据缓冲中的数据IO设备之间的交互,则是操作系统和硬件驱动程序所关心的事情了.因此,数据缓冲在IO操作中具有重要的作用,是操作系统与应用之间的IO桥梁.
在java.nio中, "Direct ByteBuffer"是一个值得关注的Buffer类型.在创建ByteBuffer的时候可以使用ByteBuffer.allocateDirect()来创建一块直接(Direct)的ByteBuffer.这一块数据缓冲和一般的缓冲不一样.第一,它是一块连续的空间.第二,它的实现不是纯java的代码,而是本地(native)代码.它内存的分配不在Java的堆栈中,不受java内存回收的影响.这种直接的ByteBuffer是NIO用来保证性能的重要手段.刚才提到,数据缓冲是操作系统和应用程序之间的IO桥梁.应用程序需要写出去的数据放到数据缓冲中,操作系统从这块缓冲中获得数据执行写操作.当IO设备数据传进来时,操作系统会将数据放到相应的数据缓冲中,应用程序从缓冲中读进数据进行处理.一般的java对象很难胜任这个直接的数据缓冲工作.而操作系统需要的是一片连续不变动的地址空间,才能完成IO操作.在原来的java版本中需要java虚拟机的介入,将数据进行转换,拷贝才能被操作系统所使用.而通过"Direct ByteBuffer", 应用程序能够直接与操作系统进行交流,大大减少了系统调用的次数而提高了执行效率.
数据缓冲的另外一个重要特点是可以在一个数据缓冲中上再建立一个或多个视图(View)缓冲.这个概念有些类似于数据库视图的概念.同样,在一个数据缓冲之上也可以建立多个逻辑的视图缓冲.视图缓冲的用处很多,例如可以将Byte类型的缓冲当作Int类型的视图,来进行类型转换.视图缓冲也可以将一个大的缓冲看成是很多小的缓冲视图.这对提高性能很有帮助,因为创建物理的数据缓冲(特别是直接的数据缓冲)是非常耗时的操作,而创建视图却非常快.在如Grizzly等框架中就有这方面的考虑.

2.异步通道(Channel)
Channel(又称频道)是NIO的另外一个重要的特性.Channel并不是对原有java类的扩充和完善,而是完全崭新的实现.通过Channel, java应用程序能够更好的与操作系统的IO服务结合起来,充分的利用上文提到的ByteBuffer,完成高性能的IO操作.Channel实现也不是纯java的,而是和操作系统结合紧密的本地代码.
Channel的一个重要特点是在网络套接字频道(SocketChannel)中,可以将其设置为异步非阻塞方式.

3.有条件的阻塞(Readiness Selection)
类似UNIX的select()或poll().在现在大多数主流OS上,都支持有条件地选择已经准备好的IO通道,这就使得只需要一个线程就能同时有效地管理多个IO通道.
NIO通过几个关键的类来实现这种有条件选择的功能:
1) Selector
Selector维护了多个注册的Channel以及它们的状态.Channel需要向Selector注册,Selector负责维护和更新Channel的状态,以表明哪些Channel是准备好的.
2) SelectableChannel
SelectableChannel是可以被Selector所管理的Channel. FileChannel不属于SelectableChannel,而SocketChannel则属于.因此在NIO中,只有网络IO操作才可能被有条件选择.
3) SelectionKey
SelectionKey用于维护Selector和SelectableChannel之间的映射关系.当一个Channel向Selector注册后,就回返回一个SelectionKey作为注册的凭证.[ft=#ff0000,,]Selectio
Tags:  java的nio javanio

延伸阅读

最新评论

发表评论