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

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

Selector

1.1. NIO 和 OIO 的对比

旧的IO(OIO) 和 NIO 的区别主要体现在三个方面:

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

(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

转载于:https://www.cnblogs.com/crazymakercircle/p/9826759.html

JAVA NIO 简介 (netty源码死磕1.1)相关推荐

  1. ChannelHandler揭秘(Netty源码死磕5)

    精进篇:netty源码死磕5  揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4. ...

  2. Pipeline模式(netty源码死磕6)

    精进篇:netty源码死磕6  巧夺天工--Pipeline模式揭秘 1. 巧夺天工--Pipeline模式揭秘 1.1. Pipeline模式简介 管道的发名者叫,Malcolm Douglas M ...

  3. Java NIO——Selector机制源码分析---转

    一直不明白pipe是如何唤醒selector的,所以又去看了jdk的源码(openjdk下载),整理了如下: 以Java nio自带demo : OperationServer.java   Oper ...

  4. Netty 源码(ChannelHandler 死磕)

    精进篇:netty源码死磕5  - 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4 ...

  5. 死磕 java集合之ArrayDeque源码分析

    问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...

  6. 【死磕 Java 集合】— LinkedTransferQueue源码分析

    [死磕 Java 集合]- LinkedTransferQueue源码分析 问题 (1)LinkedTransferQueue是什么东东? (2)LinkedTransferQueue是怎么实现阻塞队 ...

  7. 死磕Java集合之BitSet源码分析(JDK18)

    死磕Java集合之BitSet源码分析(JDK18) 文章目录 死磕Java集合之BitSet源码分析(JDK18) 简介 继承体系 存储结构 源码解析 属性 构造方法 set(int bitInde ...

  8. java arraydeque_死磕 java集合之ArrayDeque源码分析

    问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...

  9. Netty源码深度解析-ByteBuf(1) ByteBuf简介

    导读 原创文章,转载请注明出处. 本文源码地址:netty-source-code-analysis 本文所使用的netty版本4.1.6.Final:带注释的netty源码 本文简要地介绍ByteB ...

最新文章

  1. Go Python 6: Softmax Classifier
  2. C#中使用MoveTo和Path.ChangeExtension方法实现文件更改后缀名
  3. 使用 FOREACH 迭代具有依赖类型的序列
  4. 【SVN】版本冲突处理之设置needs-lock:true属性
  5. 用C语言实现SGF格式围棋棋谱解析器
  6. docker 安装 mysql和Navicat Premium 远程连接
  7. 用javascript实现(页面正在加载的效果)
  8. java声明代码是什么_java安全编码指南之:声明和初始化说明
  9. Springmvc_3(SessionAttributes 将数据放入到session中)
  10. 联想微型计算机怎么进入bios,详细教你联想电脑怎么进入bios
  11. Python备份文件实现以及备份大文件出错解决方案
  12. kafka 安装,使用教程
  13. 第11期-通过斗鱼直播爬取弹幕
  14. 51单片机制作简易计算器(动态数码管、矩阵按键)
  15. 图着色问题(超详细!!!)
  16. etc fstab 详解linux,/etc/fstab功能详解
  17. 外贸怎么开发客户?这些你不一定知道
  18. Vue教程-day05-2018年12月25日笔记
  19. 国外赛事直播加速案例
  20. psv摇杆测试软件,adrenaline专用右摇杆控制视角插件发布, 转

热门文章

  1. 【Android Camera】之 Preview
  2. 第十节 javascript之第四节 函数
  3. Spring强制使用CGLIB代理事务
  4. 使用Typescript开发(二)
  5. TiKV 是如何存取数据的(下)
  6. elasticsearch删除索引后再新建时踩的坑
  7. HDU 6241 Color a Tree
  8. UVA - 1279 Asteroid Rangers (动点的最小生成树)
  9. 基于webview的选择滑动控件(PC和wap版)
  10. 一刀两断划分子网例子