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 条评论
登录 后参与评论

相关文章

  • SpringMVC<一> 基本结构与配置

    刚刚踏入SpringMVC的学习,有一定Strust2的使用经验,边看书看博客,边总结,如有不对的地方还希望各位大佬多多指正。

    Rekent
  • Spring 学习笔记(四)—— XML配置依赖注入

      依赖注入(DI)与控制反转(IoC)是同一个概念,都是为了处理对象间的依赖关系。

    Rekent
  • Spring 学习笔记(五)—— Bean之间的关系、作用域、自动装配

      Spring提供了配置信息的继承机制,可以通过为<bean>元素指定parent值重用已有的<bean>元素的配置信息。

    Rekent
  • Android应用程序与SurfaceFlinger服务的连接过程分析

    Android系统的开机动画是由应用程序bootanimation来实现的,它位于/system/bin目录下,它的具体实现可以参考Android系统的开机画面...

    233333
  • kafka单节点的安装,部署,使用

    1、kafka官网:http://kafka.apache.org/downloads

    别先生
  • Android vs iOS:未曾停息的强强对决

    前言: 近期,各种安全事件层出不穷,难以平抚内心浮躁的人们,不妨静下心来品读这篇文章,一位外国朋友对“iOS vs Android”综合的分析。难得一见的对两大...

    FB客服
  • python中数字是否为可变类型

    通过id函数查看变量i的内存地址进行验证(使用hex(id(i)) 可以查看16进制的内存地址)

    砸漏
  • 一起学Excel专业开发27:使用类模块创建对象6

    这里,我们不再像《一起学Excel专业开发26:使用类模块创建对象5》中那样,在CCells类模块中引发ChangeColor事件,而是创建一个触发类模块来取代...

    fanjy
  • 镁客网每周硬科技领域投融资汇总(8.20-8.26)

    镁客网
  • Flutter |macOS 下载安装配置

    4. 通过 flutter doctor 验证当前 Flutter 开发环境是否完善

    HLQ_Struggle

扫码关注云+社区

领取腾讯云代金券