关于NIO编程
NIO概述
什么是NIO?
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。
Java NIO: Channels and Buffers(通道和缓冲区)
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
Java NIO: Non-blocking IO(非阻塞IO)
Java NIO可以让你非阻塞的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
Java NIO: Selectors(选择器)
Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。
注意:传统IT是单向。 NIO类似
读取时候 inputStream 输入流 程序读取文件
OutStream 输出流 程序写文件
读写时候 是单向的
有通道的概念 通道+缓冲区 而不是存放在流 类似火车
缓冲区里面 有数据。 程序读取文件 直接通过缓冲区 取值 (缓冲区 去文件取值) 缓冲区可以复用的作用 数据都是放在缓冲区的 可以复用的
可以多个缓冲区 封装成一个缓冲区
断点续传: 多线程+文件拼接 :一个文件拆分多个线程(多个请求分段下载) 最后拼接成一个文件
区别
IO |
NIO |
面向流 |
面向缓冲区 |
阻塞IO |
非阻塞IO |
无 |
选择器 |
NIO 编程是 jdk1.4 在IO基础上进行(NIO中有一个非阻塞IO)、 之前的IO是阻塞的IO。阻塞IO,请求不能立即响应,IO阻塞状态,不能继续响应了,解决方案就是再开启线程(伪异步)
NIO面向缓冲区 IO面向流
NIO效率高,非阻塞的。Netty dubbo 之类的都用到