NIO初探

NIO的前世今生

NIO又叫NonBlockingI/O,即非阻塞I/O。以此对应的,有一个更常见的IO(BIO),又叫Blocking I/O,即阻塞IO,两种都为Java的IO实现方案。

NIO/BIO 阻塞与非阻塞

以客户端连接服务器为例,服务器需要获取客户端的连接,即Socket,传统I/O如果没有获取到连接则一直阻塞,知道拿到为止,即函数:

$$ accept() $$

而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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏奔跑的蛙牛技术博客

javaBean 简单理解JavaBean简单及使用

PO:persistant object持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用P...

1424
来自专栏逢魔安全实验室

微软公式编辑器系列漏洞分析(一):CVE-2017-11882

? 0x00 简介 CVE-2017-11882为Office内存破坏漏洞。攻击者可以利用漏洞以当前登录的用户的身份执行任意命令。所影响的组件是Office...

3345
来自专栏地方网络工作室的专栏

Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本

Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全...

27410
来自专栏Linux驱动

41.Linux应用调试-修改内核来打印用户态的oops

1.在之前第36章里,我们学习了通过驱动的oops定位错误代码行 第36章的oops代码如下所示: Unable to handle kernel paging...

2685
来自专栏老码农专栏

原 荐 ActFramework 发布 1.

2223
来自专栏Spring相关

第7章—SpringMVC高级技术—处理异常

不管发生什么事情,不管是好的还是坏的,Servlet请求的输出都是一个Servlet响应。如果在请求处理的时候,出现了异常,那它的输出依然会是Servlet响应...

1314
来自专栏Phoenix的Android之旅

绕过谷歌禁止反射的一种办法

Androi P之后Google可能会禁止使用反射来获取隐藏方法的调用,虽然在preview版本中只会以log的形式提示,但后续的版本可能会在使用反射时直接抛出...

981
来自专栏程序员互动联盟

【专业技术】谷歌浏览器实现Javascript扩展

编者按:Javascript扩展有很多种,C++和IDL,纯JS等等,看看下文介绍一位前辈的博客,相信对大家有帮助。 写chromium扩展、写webui,还有...

3576
来自专栏chenssy

【死磕Sharding-jdbc】---基于ssm

本篇文章讲解如何在ssm(spring、springmvc、mybatis)结构的程序上集成sharding-jdbc(版本为1.5.4.1)进行分库分表; 假...

1722
来自专栏Danny的专栏

System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其他信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1222

扫码关注云+社区

领取腾讯云代金券