1. 什么是NIO?
java.nio 全称 java non-blocking IO,是指 JDK1.4 及以上版本里提供的新 API(New IO) ,为所有的原始类型( boolean 类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。【百度百科】
优点:NIO 比 AIO(异步I/O) 更加强大,处理数据更快。它可以大大的提高IO吞吐量,常用在高性能服务器上面。
2. NIO原理
使用较少的线程执行更多的任务。
如下图所示,使用较少的线程,通过 Selector 选择器来执行不同 Channel 通道中的任务,执行任务再结合 AIO(异步I/O)就能发挥服务器的最大性能,更大程度上提升服务器的运行效率。
3. 与常规 I/O 的区别
常规 I/O (如 InputStream 和 OutputStream)存在很大的缺点,就是他们是阻塞的,而 NIO 解决的就是常规 I/O 执行效率低的问题,即采用非阻塞高性能运行的方式来避免以前以前“笨拙” I/O 带来的低效率问题。NIO在大文件操作上相比常规 I/O 更加优秀,对常规 I/O 使用的 byte[] 和 char[] 进行封装,采用 ByteBuffer 类来操作数据,再结合针对 File 或者 Socket 技术的 Channel,采用同步非阻塞技术实现高性能处理。
4. 缓冲区介绍
在使用传统的I/O流API时,如 InputStream 和 OutputStream ,以及Reader和Writer联合使用时,常常把字节流中的数据放入byte[]字节数组中,或把字符流中的数据放入char[]字符数组中,也可以从 byte[] 或 char[] 数组中获取数据来实现功能上的需求,但由于在 Java 语言中对 array 数组自身进行操作的 API 非常少,常用的操作仅仅是 length 属性和下标[x]了,在 JDK 中也没有提供更加方便操作数组中数据的 API,如果对数组中的数据进行高级处理,需要程序员自己写代码进行实现,处理的方式是比较原始的,这个问题可以使用 NIO 技术中的缓冲区Buffer类来解决,它提供了很多工具方法,大大提高了程序开发的效率。
推荐书籍:
- [高洪岩]《Java多线程编程核心技术》
- [高洪岩]《Java并发编程:核心方法与框架》
- [高洪岩]《NIO与Socket编程技术指南》