NIO初探
NIO的前世今生
NIO又叫NonBlockingI/O,即非阻塞I/O。以此对应的,有一个更常见的IO(BIO),又叫Blocking I/O,即阻塞IO,两种都为Java的IO实现方案。
NIO/BIO 阻塞与非阻塞
以客户端连接服务器为例,服务器需要获取客户端的连接,即Socket,传统I/O如果没有获取到连接则一直阻塞,知道拿到为止,即函数:
\]

而NIO则采用一种没有连接则直接返回的非阻塞方式进行客户端连接获取。

NIO基本模型
BIO以Stream为传递的基本单位,将各类数据装换为Stream进行传递写入,而NIO引入了Buffer和Channel的理念,将数据写入Buffer,以Buffer为载体,在Channel中传递,下面来看看官方文档对其的定义:
Buffer
特定的基本类型数据的容器,Buffer是特定的基本类型的线性、有序序列的集合,其含有三个参数:capacity、limit和position。
capacity :标示Buffer所有能承载的最大类型数量,其不会为负也不会改变;
limit :是第一个不应该不被读写的元素的索引,其不会为负也不会大于capacity;
position :是下一个应该被读写元素的索引,其不会为负也不会大于limit
除此之外:对于每个非布尔基元类型,这个类有一个子类,比如:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
Channel
I/O操作的连接。通道表示对实体的开放连接,例如硬件设备、文件、网络套接字,或可执行一个或多个不同I/O操作的程序组件,例如读取或写入。
通道不是打开就是关闭。通道在创建时是打开的,一旦关闭,它将保持关闭状态。一旦通道被关闭,任何试图在其上调用I/O操作的尝试都会导致一个ClosedChannelException被抛出。通道是否打开可以通过调用其isOpen方法进行测试。
NIO 应用场景
- Socket网络服务
利用SocketChannel,Buffer,Selector等类构建一个通过轮询方式,以请求对应线程的服务端的I/O服务。
- Files 文件类的操作
通常我们利用传统I/O处理文件,需要使用FileInputStream、FileOutputStream来进行文件处理,而NIO的Files和Path两者结合起来就可以处理很多文件相关的操作,如copy()、write() 等。有现成的函数可以调用,而不用再在流转化上花费更多的时间。
与此同时,NIO对文件系统,目录等的迭代也有相关具体实现。
详情请参考 API文档: Java™ Platform
Standard Ed. 8
NIO初探的更多相关文章
- Netty学习(2):IO模型之NIO初探
NIO 概述 前面说到 BIO 有着创建线程多,阻塞 CPU 等问题,因此为解决 BIO 的问题,NIO 作为同步非阻塞 IO模型,随 JDK1.4 而出生了. 在前面我们反复说过4个概念:同步.异步 ...
- Java持久化之 -- 傲娇的NIO
NIO: Jdk 1.4+ New IO 面向通道和缓冲区 所在包:java.nio 执行流程: 数据总数由通道写入到buffer , 或者是从buffer写入通道 完全替换IO(面向流 单向的) ...
- JVM初探 -JVM内存模型
JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...
- Thrift入门初探(2)--thrift基础知识详解
昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...
- tomcat线程初探
博主:handsomecui,希望路过的各位大佬留下你们宝贵的意见,在这里祝大家冬至快乐. 缘由: 初探缘由,在业务层想要通过(当前线程的栈)来获取到控制层的类名,然后打日志,可是发现并不能通过当前线 ...
- JVM初探- 使用堆外内存减少Full GC
JVM初探-使用堆外内存减少Full GC 标签 : JVM 问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao.LinkedIn.Vdian), 虽然CMS可与用 ...
- epoll, NIO,AIO
Java 网络IO编程总结(BIO.NIO.AIO均含完整实例代码) Java中BIO,NIO和AIO使用样例 https://blog.insanecoder.top/javazhong-bio-n ...
- 响应式Spring Cloud初探
响应式Spring Cloud初探 分类:工程原文链接:The Road to Reactive Spring Cloud作者: JOSH LONG译者: helloworldtang日期:JUNE ...
- 2.Netty 与 NIO 之前世今生
2.Netty 与 NIO 之前世今生 本文围绕一下几点阐述: 1. NIO 的核心组件 Buffer.Selector.Channel. 2.何谓多路复用? 3.Netty 支持的功能与特性. ...
随机推荐
- 如何让tomcat服务器运行在80端口,并且无需输入项目名即可访问项目()
这个问题最开始遇到的时候是半年前,自己买了个服务器玩,但是域名解析的时候出了问题,我查了查资料才知道腾讯云是默认解析到80端口,而且还改不了. 首先是修改tomcat运行端口号,默认是8080,但是我 ...
- 04JavaScript语法
1.JavaScript 语法 JavaScript 是一个脚本语言. 它是一个轻量级,但功能强大的编程语言 2.JavaScript 字面量 在编程语言中,一般固定值称为字面量,如 3.14. 数字 ...
- 关于CoreLocation定位服务的简单使用
在我们发微博,发表空间内容,以及在朋友圈发表动态的时候,会发现有一个位置信息的控件.iOS中是如何定位我们的位置信息的呢?基于此写一个小Demo,供大家参考使用. 在iOS中,用于定位时需要我们导入以 ...
- 关于“CheckBox”通过表单提交的问题
大多数时候CheckBox取值传到java后台都是通过js取值,ajax传值,今天改一离职同事的老代码,那家伙通过表单提交一些列的CheckBox设置,没想到的是后台死活接收不正常,name.valu ...
- tp3.2源码解析——入口文件
如果有人读这篇文章并跟着做的话,希望你能使用支持函数跳转的编辑器,还要善用var_dump和exit,对着源码去调试着看.跟着入口文件读,执行到哪里你看到哪里,对于那些不能一眼看出来的配置,则要记录下 ...
- robotframework+appium,数字键盘输入问题,keycode,press keycode
需要注意事项 appium自带的输入法应该是无法模拟控制键和基本键的,需要自行使用adb切换成搜狗或者android输入法,然后case完成之后记得切回appium输入法 appium模拟发送基本键命 ...
- Python写网络后台脚本
Python写网络后台脚本. 首先安装Python3.6.5,在centos中自带的Python是2.6版本的,现在早就出现了3.6版本了况且2和3 之间的差距还是比较大的,所以我选择更新一下Pyth ...
- HyperLedger Fabric 1.4 Solo模式简介(10.1)
Solo模式指单节点通信模式,该环境中只有一个排序(orderer)服务,从节点(peer)发送来的消息由一个orderer进行排序和产生区块:由于排序(orderer)服务只有一个orderer为所 ...
- 使用ChipScope Pro调试硬件
chipscope_icon提供与其他ChipScope内核的通信 chipscope_opb_iba促进传统片上外设总线(OPB)事务的监控 chipscope_plb_iba便于监控处理器本地总线 ...
- 20145202马超 2016-2017-2 《Java程序设计》第二次实验
去年完成的一部分(http://www.cnblogs.com/tuolemi/p/5728826.html) 今年我又从新做的,这是分别5个问题做出来的结果 下面这个是去年没有做的,是用来建模的,感 ...