Java NIO

来源:互联网 发布:巅峰软件大全手机 编辑:程序博客网 时间:2024/06/05 19:16

        作为C/C++程序员,初次听到Java NIO这个名词有点茫然。仔细学习了Java NIO的细节和用法,个人理解如下:

        其实Java NIO的功能对C程序员并不陌生,和我们经常接触的 select / poll / epoll 是类似的。本质上Java NIO在Linux 2.6内核之后就是通过epoll来实现。

        不论 Java NIO还是 C中的 select / poll / epoll, 其设计思路就是对传统的阻塞型 I/O 做补充完善,实现非阻塞 I/O;

        我们知道,在传统的阻塞型I/O中,accept()等待过程中若没有新的连接请求到来,就一直阻塞;请求读写过程在等待数据时也会阻塞。考虑到每来一个新连接通常需要开启一个新线程去处理,如果许多线程处在阻塞状态,无疑是对计算资源的浪费。

         Java NIO提供事件驱动的非阻塞型I/O,面对多个连接请求(不论是来自块设备还是Socket连接)的情况,可以把众多连接侦听放在一个或尽可能少的进程中进行管理,请求到达时则可以派发给相关线程处理。这对于处理高并发且所需响应时间很短的event,将会非常高效。

          当然,Java NIO还提供了所谓的块读写, 相比Java IO有优势。传统的Java IO, 程序需要生成Java对象(比较多的是String类型)来存储每次从连接中读到的数据,处理数据后这些临时的对象又要被释放。极端情况下,如果每次读取1字节数据,这种临时对象的创建和删除会相当低效。Java NIO提供了Buffer读写功能,数据从连接读出后直接存放到Buffer(缓存)中,无需字符串对象做中间存储,这就减少了不必要的性能和资源损耗。

          先总结这么多,若有不当之处还请Java高手指正。最后还是要Highlight 下IBM的高质量文档,下面这篇关于Java NIO入门的介绍非常经典,可以作为学习参考:

          http://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html


0 0