Java NIO 入门学习(过门)

Java NIO(New IO) 还是在 JDK 1.4 中引入的新特性。JDK 1.4 的另一重要特性正则表达式大家应该经常用到,但 NIO 就可能使用寥寥了,大概是缘于旧有 IO 体系仍然够用。有如 JDK1.5 早就泛型和注解了,但基于各种原因而无法亲力去实践泛型和注解一般,NIO 多数时候也只是与我们擦着肩而已。

相比与 Old IO,NIO 在某些领域里确有其过人之处,所以现在让我们一起来对 NIO 有个更楚的认识。

NIO 的相关 API,在 java.nio 中,它会与你纠缠的就是各种 ChannelBuffer。相关的应用在于处理通道和缓冲区、异步(非阻塞)的 IO、文件的锁定、字符集的处理上。

Channel 可以通过调用 FileInputStream、FileOutputStream、RandomAccessFile、DatagramSocket、ServerSocket 和 Socket 的 getChannel() 方法获得。Channel 有点像旧 I/O 的流,旧 I/O 的读写操作可以在流上直接进行,而 NIO 都是在各种 Buffer 上读写数据。

由于使用了独有的通道和缓冲区,相比旧有的 IO 流处理的是字节流(流 IO),NIO 所使用的方式是块 I/O,所以在大块数据处理时块 I/O 比流 I/O 效率要高。NIO 在一定程度上相当于用本地代码来处理了 I/O 操作。

异步 I/O 使得你在进行网络传输时,无需像原来那样 read()/write() 来阻塞线程来等待数据的到来和直至写完数据。NIO 的方式是注册监听器来监听通道上的事件,在一个线程上就能流畅的处理 Socket 通信。不像旧 I/O 必须求助于轮询并创建许许多多的线程来处理大量的连接。

例如,基于 NIO 的组件有,网络应用框架 Apache MINA,Memcached 客户端 XMemcached,Socket 应用组件 xSocket,还有 Tomcat 6 也支持使用 NIO 的 connector 了。

文件锁使得 Java 程序也可以对整个文件或文件的部分进行独占(排它)或共享的读或写,防止了不同的进程对同一个文件的干扰。不过在不同的作系统下的行为可能会有细微的差异。文件锁(Lock)可以通过 Channel 的 lock() 或 tryLock() 获得,Channel 的 release() 方法或关闭通道时即释放了锁。

另外,NIO 可以更好的使用控制字符集。

与 NIO 还有一个很重要的 Buffer 就是内存映射文件--通过调用 FileChannel 类的 map() 方法可获得 MappedByteBuffer,此内存映射文件与 Windows 下的内存映射有相似性,又不尽然,Windows 下的内存映射文件可用来在不同的进程间共享数据,Java 的这个东西要细究下。

以上本就是泛泛而语,初识者或会觉得不知所云,也无甚味可解,原本就是对 Java NIO 的粗犷的理解,杂乱而无序。

在 IBM DeveloperWorks 上有一个 Java NIO 入门教程,https://www6.software.ibm.com/developerworks/cn/education/java/j-nio/tutorial/index.html,为了便于学习和分享,特制作成了一个 chm 文件:NIO 入门.chm.rar

参考资料:

本文链接 https://yanbin.blog/java-nio-get-started/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

2 Comments
Inline Feedbacks
View all comments