原文地址
正文
NIO 简介
NIO有两种解释:一种叫非阻塞IO(Non-blocking I/O),另一种叫新的IO(New I/O),其实是同一个概念。它是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。
NIO是一种基于通道
和缓冲区
的I/O方式,它可以使用Native函数库直接分配堆外内存(区别于JVM的运行时数据区),然后通过一个存储在Java堆里面的DirectByteBuffer
对象作为这块内存的直接引用进行操作。这样能在一些场景显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
NIO组件
NIO主要有三大核心部分:Channel(通道)
,Buffer(缓冲区)
, Selector(选择器)
。传统IO是基于字节流
和字符流
进行操作(基于流Stream
),而NIO基于Channel
和Buffer
进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector
用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程就可以监听多个数据通道。
-
Buffer
(缓冲区)是一个用于存储特定基本类型数据的容器。除了boolean外,其余每种基本类型都有一个对应的Buffer
类。Buffer
类的子类有ByteBuffer
,CharBuffer
,DoubleBuffer
,FloatBuffer
,IntBuffer
,LongBuffer
,ShortBuffer
-
Channel
(通道)表示到实体,如硬件设备、文件、网络套接字或可以执行一个或多个不同 I/O 操作(如读取或写入)的程序组件的开放的连接。Channel
接口的常用实现类有FileChannel
(对应文件IO)、DatagramChannel
(对应UDP)、SocketChannel
和ServerSocketChannel
(对应TCP的客户端和服务器端)。