暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

NIO三大核心部分

Nullit 2021-05-31
261

前面提到了NIO的三个核心部分,但是为了让章数看起来多一点点 我放到了这里来写,不可否认有一定的水贴成分 哈哈 话不多说开始



01


Buffer

缓冲区本质上是一个可读可写数据的内存块,可以理解成是一个容器对象,该对象提供了一组方法,可以更轻松地使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。channel提供从文件、网络读取数据渠道,但是读取或写入的数据都必须经过buffer

    

    Buffer类和它的子类:


NIO中,Buffer是一个顶层父类 它是一个抽象类

Buffer定义了所有缓冲区都具有的四个属性来提供关于其所有包含的数据元素的信息

capacity:

容量,在缓冲区创建时设定且不能改变的

limit:

表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作,且极限是可以修改的

Position:

位置,下一个要被读或写的元素索引,每次读写缓冲区数据都会改变这个值,为下次读写做准备

Mark:

标记


 

       Buffer类相关方法:

       

            capacity: 
    返回此缓存区的容量


    position:
    返回此缓存区的位置


    position(int newPosistio):
    设置此缓存区的位置


    limit:
    返回此缓存区的限制


    limit(int newlimit)
    设置此缓存区的限制


    mark:
                在此缓冲区的位置设置标记


    reset:
    将此缓冲区设置的位置重置为以前的标记位置


    clear:
    清除此缓冲区,将各个标记恢复到初始化状态
    (重置标志位),但数据并没有真正消除


    flip:
    反转此缓冲区


    rewind:
    重绕此缓冲区


    remaining:
    返回当前位置和限制之间是否有元素


    hashRemaining:
    告知此缓冲区是否为只读缓冲区


    hashArry:
    告知此缓冲区是否具有可访问的底层实现数组


    array:
    返回此缓冲区的底层实现数组


    arrayOffset:
    返回此缓冲区的底层实现数组中的第一个缓冲区元素的偏移量


    isDirect:
    告知此缓冲区是否为直接缓冲区


    ByteBuffer:
                字节buffer,网络传输其实底层都是字节传输的 所以应该是最常用的
             直接缓冲区 操作物理内存 而非jvm内存
          allocateDirect(int capacity) 创建直接缓冲区


      allocate: 设置 缓冲区初始容量


      wrap(byte[] array) 把一个数组放到缓冲区中使用


      Wrap (byte[] array,int offset,int length) 初始化位置offset和上界length的缓冲区


      get 从当前位置position上get,get之后 position会自动加一


      get(index) 从绝对位置get


      put(byte b) 从当前位置上put,put之后 position自动加一


      put(int index,byte b) 从绝对位置上put,因为知道在哪里放 所有position不会变化



      Buffer的分散和聚合ScatteringAndGathering

      Scattering 死卡特儿锐 :将数据写入到buffer时,可以采用buffer数组,依次写入
      文章转载自Nullit,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论