NIO

Posted qhj348770376

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NIO相关的知识,希望对你有一定的参考价值。

一、是什么

  NIO:(non-bloking IO)非阻塞IO,为所有的原始类型提供缓存(buffer)支持。字符集编码解码解决方案。支持锁和内存映射文件的文件访问接口。提供多路非阻塞式的高伸缩性网络IO。(果然官网上都是一些非人类的东西)。

  IO:广义的IO指的是计算机与外部世界或者是程序与计算器其他部分的接口。狭义上Java里的IO只的是面向流的老IO接口。

二、有什么用

  NIO的引入是为了实现高速的IO功能。

  传统IO是通过数据流和序列化实现系统输入和输出。数据流都继承自InputStream和OutputStream。阻塞式IO,当一个线程调用read()或者write()实现IO功能时,该线程会被阻塞,知道有一些数据被读取或者数据完全写入,而不能干其他事。IO面向流意味着每次从流中读取一个或者多个字节,直至读取所有的字节,没有被缓存。另外不能前后移动流中的数据,如果需要前后移动从流中读取数据,需要先将他缓存到另一个缓冲区。

  NIO是基于通道和缓冲区的 I/O 方式。是一种同步非阻塞的 IO 模型。同步是指线程不断轮询 IO 事件是否就绪,非阻塞是指线程在等待 IO 的时候,可以同时做其他任务。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。NIO面向缓冲是想数据读取到一个缓冲区供后续使用,可以在缓冲区中前后一定数据。

三、怎么用

  通道和缓冲区是NIO的核心对象。网络传输时的过程:用户数据——>发送端缓冲——>发送端Channel——>网络传输——>接收端Channel——>接收端缓冲——>用户数据。

  任何写入写出的数据都要通过通道(channel)对象。可以通过它读取和写入数据,类似于IO里的流。Channel就像一个管道一样,将数据在管道两端的字节缓冲之间进行高效率的传输。它就像是一个网关,通过它可以用最小的成本来访问操作系统本地的I/O服务,而缓冲则是在两端内部的端点,Channel使用它来发送和接收数据。包括FileChannel、ServerSocketChannel、SocketChannel、DatagramChannel。

  缓冲区(buffer)实际是一个数据容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;从通道中读取的任何数据都要读到缓冲区中。缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。

四、深入研究方向

  选择器(Selector)提供了挑选可用状态Channel的能力,从而实现多路复用的I/O。选择器能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。

  4.1、AIO

  4.2、NIO和IO底层具体实现方式

  4.3、四类channel的异同。

  4.4、NIO和epoll

五、面试点

以上是关于NIO的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO:IO与NIO的区别

IO 性能:Selector (NIO) vs AsynchronousChannel(NIO.2)

Java nio NonBlocking NIO

Java NIO:IO与NIO的区别

Java:NIO 和 NIO.2 到底有啥区别?

NIO 源码分析(03) 从 BIO 到 NIO