Nio 初步了解

1.对于基本的javaSE我们更多的了解是jdk的api提供给我们的IO包的使用,比如说构建抽象路径的File   基本的字节流,字符流  转换流的使用。但是基于jdk 1.4版本和现在1.7版本提供给我们的NIO包下的流很少有人知道和使用,因为我们习惯的使用了IO包下的流,最近做一个调度系统其中包括文件的传输,基于协议传输希望采用netty来实现,但是实际上netty是基于NIO来实现的,所以我们需要去了解Nio的实现,这样才更有利于我们去学习Netty。所以简单的分享一下NIO的学习心得和使用。

1  nio的概念:

NIO是jdk1.4版本提出的对于IO操作的API。和基本的IO相比,来说可以提高在网络传输过程中的传输效率,而实际上是通过对线程的高效利用率而提供了非阻塞式的IO操作。对于基本的IO操作来说是单向的,但是对于Nio来说却是双向的。可以通过缓冲区来存储数据,并可以改变限制位置来实现数据的重新存储。

2.nio和io的对比

NIO:(1)非阻塞式IO    (2)选择器       (3)面向缓冲区

IO  : (1)阻塞式  IO      (2)无选择器   (3)面向IO

3 nio中的缓冲区和通道

缓冲区:缓冲区是用来储存数据的地方。底层实际上是通过数组实现的。最常用的缓冲区ByteBuffer.

通道   : 是用来传输存储数据的

4 缓冲区的方法和使用(jdK的API中提供了我们基本数据类型的缓冲区,但是对于流擦操作,最常用的就是ByteBuffer):

   缓冲区的类型:byteBuffer shortBuffer intBuffer longBuffer floatBuffer doubleBuffer charBuffer

   缓冲区的 容量 限制  位置

    (1)容量:代表了我们所分配给缓冲区最大的容量,也就是我们可以存储数据的最大容量

    (2)限制 :当我们向缓冲区中添加数据时,指针会根据我们存储数据的大小移动指针,此位置索引所指向的内容不可读

    (3)位置 :下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制

        position():用于获取当前位置,如果开始进行读取,位置会放置在已读取内容的后一位。

        limit() :用于设置限制,如果设置限制位置为6,那么从6以后的位置禁止读写操作。

        capacity():获取给定的缓冲区的容量的大小。

        hasRemaing():判断是否还有未读取的数据。代表的是从position到限制之间。

        flip() :将写入状态变成读取状态,只有调用这个方法才会实现读的操作,一般会读取到数组中。

        put() :向缓冲区写入数据。

        get() :读取缓冲区数据,一般读到数组中,通过String构造方法来获取。

       mark( ) :标记一个位置,通过reset方法可以返回标记位置。

       reset() :返回之前标记位置。

       isDirect() :判断是否是直接缓冲区

 

     直接缓冲区和非直接缓冲区:

     直接缓冲区:

     通过allocateDirect()分配直接缓冲区,直接缓冲区是建立在物理内存上的,有可能会提高效率

     非直接缓冲区:

     通过allocate()分配非直接缓冲区,非直接缓冲区是建立在JVM的虚拟内存上的。

     非直接缓冲区:是写到jvm的虚拟内存中

                                                         通道(channel)

属于一个完全独立的处理器,附属于CPU相当于DMA是完全独立的,即使拥有大量的IO操作,直接通过通道就不会再经过CPU,这样的情况下CPU的利用率将会变高。

定义:用于源节点和目标节点的连接,在NIO中负责缓冲区中的数据进行传输。本身不实现数据的存储,所以需要通过缓冲区来实现数据的传输。

 

                                                                  nio:的分散读取与聚集写入

分散:代表的是分散读取:将通道中的数据读取到多个缓冲区中,并且是依次按顺序将缓冲区填满。将第一个缓冲区填满后,才会继续填满第二个缓冲区,这种的叫做依次填满缓冲区。

聚集:代表的是聚集写入:将多个缓冲区中的数据写到一个通道中

nio的阻塞和非阻塞(基于网络传输来定义的阻塞与非阻塞)

阻塞式IO:传统的io从客户端向服务端发送请求,如果请求没有到达服务端的内核地址空间,那么该线程将被阻塞,在发送有效的请求之前,该线程将会被一致停止。结果采用了多个线程,即使采用了多个线程,也无法保证多线程的100%的利用率,并且不能好好的利用CPU的资源。如下图:代表的是阻塞式IO

非阻塞式IO:在客户端与服务端之间通过选择器进行连接,他会判断通道是否真正的连通,如果真的连通,才会把这些任务分配到一个或者多个线程上,这样对CPU的利用率会加强。并且如果当前线程为空闲时将去别的通道进行io操作。

选择器:是SelectAbleChannle 的对象的多路复用器,可以用来监控多个SelectAbleChannel的io操作,这种情况下可以通过选择器管理多个线程,实现非阻塞IO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值