码迷,mamicode.com
首页 > 其他好文 > 详细

NIO

时间:2018-06-04 00:51:48      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:完全   通道   结构   空闲   内存映射文件   file   内存   数据   nbsp   

一、是什么

  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

标签:完全   通道   结构   空闲   内存映射文件   file   内存   数据   nbsp   

原文地址:https://www.cnblogs.com/qhj348770376/p/9131359.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!