Java NIO 是由 Java 1.4 引进的异步 IO.
Java NIO 由如下几个核心部分组成:segmentfault
Channel网络
Buffer异步
Selector线程
IO 和 NIO 的区别主要体如今三个方面:指针
IO 基于流(Stream oriented), 而 NIO 基于 Buffer (Buffer oriented)事件
IO 操做是阻塞的, 而 NIO 操做是非阻塞的博客
IO 没有 selector 概念, 而 NIO 有 selector 概念.select
传统的 IO 是面向字节流或字符流的, 而在 NIO 中, 咱们抛弃了传统的 IO 流, 而是引入了 Channel 和 Buffer 的概念. 在 NIO 中, 我只能从 Channel 中读取数据到 Buffer 中或将数据从 Buffer 中写入到 Channel.
那么什么是 基于流 呢? 在通常的 Java IO 操做中, 咱们以流式的方式顺序地从一个 Stream 中读取一个或多个字节, 所以咱们也就不能随意改变读取指针的位置.
而 基于 Buffer 就显得有点不一样了. 咱们首先须要从 Channel 中读取数据到 Buffer 中, 当 Buffer 中有数据后, 咱们就能够对这些数据进行操做了. 不像 IO 那样是顺序操做, NIO 中咱们能够随意地读取任意位置的数据.方法
Java 提供的各类 Stream 操做都是阻塞的, 例如咱们调用一个 read 方法读取一个文件的内容, 那么调用 read 的线程会被阻塞住, 直到 read 操做完成.
而 NIO 的非阻塞模式容许咱们非阻塞地进行 IO 操做. 例如咱们须要从网络中读取数据, 在 NIO 的非阻塞模式中, 当咱们调用 read 方法时, 若是此时有数据, 则 read 读取并返回; 若是此时没有数据, 则 read 直接返回, 而不会阻塞当前线程.数据
selector 是 NIO 中才有的概念, 它是 Java NIO 之因此能够非阻塞地进行 IO 操做的关键.
经过 Selector, 一个线程能够监听多个 Channel 的 IO 事件, 当咱们向一个 Selector 中注册了 Channel 后, Selector 内部的机制就能够自动地为咱们不断地查询(select) 这些注册的 Channel 是否有已就绪的 IO 事件(例如可读, 可写, 网络链接完成等). 经过这样的 Selector 机制, 咱们就能够很简单地使用一个线程高效地管理多个 Channel 了.
本文由 yongshun 发表于我的博客, 采用署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议.非商业转载请注明做者及出处. 商业转载请联系做者本人Email: yongshun1228@gmail.com本文标题为: Java NIO 的前生今世 之一 简介本文连接为: segmentfault.com/a/1190000006824091