Java NIO即Java Non-blocking IO(Java非堵塞I/O),由于是在Jdk1.4之后添加的一套新的操作I/O工具包,所以通常会被叫做Java New IO。NIO是为提供I/O吞吐量而专门设计。其卓越的性能甚至能够与C媲美。

NIO是通过Reactor模式的事件驱动机制来达到Non blocking的,那么什么是Reactor模式呢?Reactor翻译成中文是“反应器”,就是我们将事件注冊到Reactor中,当有对应的事件发生时,Reactor便会告知我们有哪些事件发生了。我们再依据详细的事件去做对应的处理。

程序的性能非常大程度上是受到I/O限制的,所以有非常多人会说程序的性能瓶颈就在I/O上也毫不为过。以下这张图显示了I/O对程序吞吐量的影响

由上图可见I/O对程序的吞吐率有着决定性的因素。

Java中旧的IO接口。对文件操作仅仅能一个字节一个字节或一行一行的读,对Socket IO会堵塞,能够为每个Socket创建一个Thread,可是这种系统开销和资源浪费都太大,不是合理选择;而NIO对Socket IO能够实现非堵塞,能够用单线程管理多个通道。而且NIO有了缓冲区的概念,无论是File IO还是Socket IO都是在和Buffer相互读取。看下图

所以NIO能够先将通道数据读到缓冲区中再进行操作。避免了逐字节或逐行读取的性能开销。

NIO有三个核心模块:Selector(选择器)、Channel(通道)、Buffer(缓冲区),另外java.nio.charsets包下新增的字符集类也是nio一个重要的模块。但个人认为不算是NIO的核心,仅仅是一个供NIO核心类使用的工具类。

Selector同意单个线程处理多个Channel,相比旧的IO为防止堵塞而为每个Channel创建一个Thread来说。性能高出许多。仅仅用SelectableChannel才干注冊到Selector。单线程处理多个Channel例如以下图

将Channel注冊到Selector中。轮询调用select()。这种方法会堵塞,当注冊的某个通道准备好要进行IO操作时,这个便返回已选择键的个数,此时通过selectedKeys获得已选择的键。就能够进行相关的IO操作了;选择键(SelectionKey)是用来连接Selector和Channel。将在兴许解说。

Channel主要有:FileChannel、ServerSocketChannel、SocketChannel、DatagramChannel,这四种通道涵盖了文件IO、TCP套接字IO、UDP数据报IO。

Buffer主要有:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer,涵盖了IO操作的基本数据类型。

Java NIO笔记(一):NIO介绍的更多相关文章

  1. Java系列笔记(0) - 目录和概述

    笔者在开发过程中发现自己基础太薄弱,读书时除了系统学习了一下Java的基础语法和用法.一点简单的数据结构和设计模式之外,再无深入系统的学习,而工作中的学习也是东晃一枪西晃一枪,不够扎实和系统.想到一个 ...

  2. Java开发笔记(九十五)NIO配套的文件工具Files

    NIO不但引进了高效的文件通道,而且新增了更加好用的文件工具家族,包括路径组工具Paths.路径工具Path.文件组工具Files.先看路径组工具Paths,该工具提供了静态方法get,输入某个文件的 ...

  3. 疯狂Java学习笔记(75)-----------NIO.2第一篇

    Java 7引入了NIO.2.NIO.2是继承自NIO框架,并添加了新的功能(比如:处理软链接和硬链接的功能).这篇帖子包含三个部分,我将使用NIO.2的一些演示样例.由此向大家演示NIO.2的基本用 ...

  4. Java BIO、NIO与AIO的介绍(学习过程)

    Java BIO.NIO与AIO的介绍 因为netty是一个NIO的框架,所以在学习netty的过程中,开始之前.针对于BIO,NIO,AIO进行一个完整的学习. 学习资源分享: Netty学习:ht ...

  5. JAVA NIO学习一:NIO简介、NIO&IO的主要区别

    在前面学习了IO之后,今天我们开始进入NIO学习环节,首先我们会NIO做一个简单的介绍,让大家认识NIO,然后会和IO进行一个对比认识进行区分.好了,下面我们就开始学习: 一.NIO简介 1.概述 从 ...

  6. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  7. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  8. Java网络编程和NIO详解6:Linux epoll实现原理详解

    Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO h ...

  9. Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO

    Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系 ...

随机推荐

  1. [luogu] P4551 最长异或路径(贪心)

    P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...

  2. jquery中的jsonp跨域调用(接口)

                                                                           jquery jsonp跨域调用接口

  3. 简单实现双向数据绑定mvvm。

  4. FastDFS 实现图片上传_01

    一.jar 包 jar包下载:https://pan.baidu.com/s/1nwkAHU5 密码:tlv6 或者 下载工程,安装到 maven 本地仓库 工程下载:https://pan.baid ...

  5. Ubuntu安装keepalived

    Ubuntu安装keepalived 一.Keepalived是什么鬼东西: keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障. 二.Ke ...

  6. Chrome插件Axure RP Extension

    Chrome插件Axure RP Extension 1.将文件夹“0.6.2_0”复制到Chrome文件夹中某个位置. 2.打开Chrome,打开[设置] - [扩展程序],勾选右上角的“开发者模式 ...

  7. [React] Use the new React Context API

    The React documentation has been warning us for a long time now that context shouldn't be used and t ...

  8. Baby_Step,Gaint_Step(分析具体解释+模板)

    下面是总结自他人博客资料.以及本人自己的学习经验. [Baby_Step,Gaint_Step定义] 高次同余方程. BL == N (mod P) 求解最小的L.因为数据范围非常大,暴力不行 这里用 ...

  9. Binary Tree Inorder Traversal--leetcode

    原题链接:https://oj.leetcode.com/problems/binary-tree-inorder-traversal/ 题目大意:中序遍历二叉树 解题思路:中序遍历二叉树.中序遍历二 ...

  10. ES设置查询的相似度算法

    similarity Elasticsearch allows you to configure a scoring algorithm or similarity per field. The si ...