JAVA NIO 简介 (netty源码死磕1.1)

【基础篇】netty 源码死磕1.1:  html

JAVA NIO简介编程

1. JAVA NIO简介

Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO。因为以前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,因此,更多的人喜欢称之为非阻塞I/O(Non-block I/O)。网络

NIO弥补了原来同步阻塞I/O的不足,它在标准Java代码中提供了高速的、面向块的I/O。异步

Java NIO 由如下几个核心部分组成:学习

Channel线程

Buffer指针

Selectornetty

1.1. NIO 和 OIO 的对比

旧的IO(OIO) 和 NIO 的区别主要体如今三个方面:htm

(1)OIO 基于流(Stream oriented),而 NIO 基于 Buffer (Buffer oriented);blog

(2)OIO 操做是阻塞的,而 NIO 操做是非阻塞的;

(3)OIO 没有 selector 概念,而 NIO 有 selector 概念.

旧的IO(OIO) 是面向字节流或字符流的,在通常的OIO操做中,咱们以流式的方式顺序地从一个 Stream 中读取一个或多个字节,所以,咱们也就不能随意改变读取指针的位置。

而在 NIO 中,而是引入了 Channel 和 Buffer 的概念。在 NIO 中,只须要从 Channel 中读取数据到 Buffer 中,或将数据从 Buffer 中写入到 Channel。而且,不像OIO 那样是顺序操做,在NIO 中,咱们能够随意地读取任意位置的数据.

1.2. 阻塞和非阻塞

在OIO中,Java 提供的各类 stream 流操做都是阻塞的,例如咱们调用一个 read 方法读取一个文件的内容,那么调用 read 的线程会被阻塞住,直到 read 操做完成。

而 NIO 的非阻塞模式容许咱们非阻塞地进行 IO 操做。 例如咱们须要从网络中读取数据。在 NIO 的非阻塞模式中,当咱们调用 read 方法时,若是此时有数据,则 read 读取并返回; 若是此时没有数据,则 read 直接返回,而不会阻塞当前线程。

NIO的非阻塞,是如何作到的呢?

使用的是通道和通道的多路复用技术。先来看通道Channel。

1.3. Channel

OIO中,一般来讲,一个链接使用有两个流,一个输入流一个输出流。经过两个流不断的进行输入和输出。

与之相对应,NIO中,一般来讲,一个链接就是一个通道Channel表示,全部的 NIO 的 I/O 操做都是从 Channel 开始的。 一个 channel 相似于OIO中的两个 stream的结合体。

1.4. selector

通道Channel要进行多路复用,基础就是选择器selector。

Selector是何方神圣?

这是一个IO事件的查询器,经过 Selector,一个线程能够查询多个 Channel 的 IO 事件的就绪状态。

咱们要作的工做,就是将要进行状态查询的Channel(至关于流)注册到选择器Seletor中。当咱们向一个 Selector 中注册了 Channel 后,Selector 内部的机制就能够自动地为咱们不断地查询(select) 这些注册的 Channel 是否有已就绪的 IO 事件(例如可读,可写,网络链接完成等)。

经过这样的 Selector 机制,咱们就能够很简单地使用一个线程高效地管理多个 Channel 了。

1.5. Java NIO Buffer

当咱们须要与 NIO Channel 进行交互时,咱们就须要使用到 NIO Buffer,即数据从 Buffer读取到 Channel 中,而且从 Channel 中写入到 Buffer 中。

Buffer的使用,也是NIO非阻塞的重要的前提和基础之一。

下面结合实例和源码实例,开启JAVA NIO的死磕之路。次序从Buffer,而后到Channel,最后讲最复杂的 Selector多路复用器。



源码:


代码工程:  JavaNioDemo.zip

下载地址:在疯狂创客圈QQ群文件共享。




无编程不创客,无案例不学习。疯狂创客圈,一大波高手正在交流、学习中!

疯狂创客圈 Netty 死磕系列 10多篇深度文章博客园 总入口】  QQ群:104131248