🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 传统IO ![](https://box.kancloud.cn/88aad4fad05e37a541be93d951cf3404_791x684.png) 传统IO,通过socket的方式发送给服务端,需要干什么事: 1. 先把文件读到操作系统的缓存当中 2. 再把操作系统的缓存中内容读到应用中 3. 再从应用的缓存当中读到发送的socket缓存当中 4. 在从socket缓存当中把数据发出去 总共做了4次IO # NIO ![](https://box.kancloud.cn/611f8d076474e9745fb18d1a71ee321f_1014x488.png) NIO比较传统IO的话,系统中的buffer不再需要拷贝给应用了 # NIO与普通IO的主要区别 **nio优势不在于数据传送的速度** nio是new io的简称,在jdk1.4里面提供的新api 为所有的原始类型提供(Buffer)缓存支持 字符集编码解码解决方案 channel:一个新的原始i/o抽象 支持锁和内存映射文件的文件访问接口 提供多路(non-bloking)非阻塞式的高伸缩性网络I/O | IO | NIO | | --- | --- | | 面向流(Stream Oriented) | 面向缓冲区(Buffer Oriented) | | 阻塞IO(Blocking IO) | 非阻塞IO(Non Blocking IO) | | (无) | 选择器(Selectors) | * Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 * Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。 * Selectors(选择器):Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。