NIO:新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的,弥补了原来的 I/O 的不足,提供了高速的、面向块的 I/O,同时支持阻塞与非阻塞模式
I/O 与 NIO 最重要的区别是数据打包和传输的方式,I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。
·通道channel:对原 I/O 包中的流的模拟,可以通过它读取和写入数据,通道与流的不同之处在于,流只能在一个方向上移动(一个流必须是 InputStream 或者
OutputStream 的子类),而通道是双向的,可以用于读、写或者同时用于读写。通道包括以下类型:
|- FileChannel:从文件中读写数据
|- DatagramChannel:通过 UDP 读写网络中数据
|- SocketChannel:通过 TCP 读写网络中数据
|- ServerSocketChannel:可以监听新进来的 TCP 连接,对每一个新进来的连接都会创建一个 SocketChannel
·选择器Selector:NIO 现了IO多路复用中的Reactor模型,一个线程Thread使用一个选择器Selector通过轮询的方式去监听多个通道 Channel 上的事件,从
而让一个线程就可以处理多个事件,通过配置监听的通道Channel为非阻塞,那么当Channel上的IO事件还未到达时,就不会进入阻塞状态一直等待,而
是继续轮询其它Channel,找到IO事件已经到达的Channel执行。因为创建和切换线程的开销很大,因此使用一个线程来处理多个事件而不是一个线程处理一
个事件,对于IO密集型的应用具有很好地性能。
·缓冲区:提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程,实际是一个数组,类型有ByteBuffer、CharBuffer、ShortBuffer、
InterBuffer、LongBuffer、FloatBuffer、DoubleBuffer,状态量有:
|-mark:标记
|-capacity:最大容量
|-position:位置
|-limit:限制
·关系:0 <= 标记 <= 位置 <= 限制 <= 容量
|-flip()方法:反转,切换读写模式
NIO编程过程
·客户端:
|-通过SocketChann