Java NIO(New IO) 还是在 JDK 1.4 中引入的新特性。JDK 1.4 的另一重要特性正则表达式大家应该经常用到,但 NIO 就可能使用寥寥了,大概是缘于旧有 IO 体系仍然够用。有如 JDK1.5 早就泛型和注解了,但基于各种原因而无法亲力去实践泛型和注解一般,NIO 多数时候也只是与我们擦着肩而已。
相比与 Old IO,NIO 在某些领域里确有其过人之处,所以现在让我们一起来对 NIO 有个更楚的认识。
NIO 的相关 API,在 java.nio 中,它会与你纠缠的就是各种 Channel 和 Buffer。相关的应用在于处理通道和缓冲区、异步(非阻塞)的 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
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。