NIO初探

NIO的前世此生

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

NIO/BIO 阻塞与非阻塞

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

\[ accept() \]
BIO 链接模型
而NIO则采用一种没有链接则直接返回的非阻塞方式进行客户端链接获取。
NIO 链接模型java


NIO基本模型

BIO以Stream为传递的基本单位,将各种数据装换为Stream进行传递写入,而NIO引入了Buffer和Channel的理念,将数据写入Buffer,以Buffer为载体,在Channel中传递,下面来看看官方文档对其的定义:

Buffer
特定的基本类型数据的容器,Buffer是特定的基本类型的线性、有序序列的集合,其含有三个参数:capacity、limit和position。api

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
oracle

相关文章
相关标签/搜索