zoukankan      html  css  js  c++  java
  • NIO缓冲区的学习笔记,大致整理一下内容

    缓冲区基础

    缓冲区说白了就是一个包装后的数组,有一组API,有一些公共和私有的属性

    任何缓冲区都有下面的属性:

    容量(capacity),缓冲区大小
    限制(limit),第一个不应被读取或写入的字节的索引,总是小于容量。
    位置(position),下一个被读取或写入的字节的索引,总是小于限制。

    标记(mark),一个备忘位置,调用mark()来设定mark=position

    四个属性遵循0<=mark<=position<=limit<=capacity

    捕获

    一个新创建的ByteBuffer

    基本操作

    除了基本的get()和put(),返回位置的positoin()的这类方法以外,还有一些初学比较容易糊涂的就是几种操作,比如:

    重置reset()就是把position移到mark处

    清空clear()就是mark为-1,position为0(移到最初),limit移到capacity那里

    flip()意味着反转,当连续put之后(每次put,position都会往后移动的),想读取内容时,就需要limit移动到position处,position为0(方便读取),mark为-1

    重绕rewind()意味着将位置设置为 0 并丢弃标记(mark为-1)

    比较

    缓冲区在比较的时候,是比较postion到limit之间的东西,而不是完全比较两个缓冲区所有的内容,所以

    AbbbC和AABBbbbC(假如postion在第一个b处,limit在最后一个b之后),比较时只比较bbb,所以两个缓冲区相等

    创建

    缓冲区在创建的时候可以直接调用allocate方法,也可以用wrap来包装,具体操作可以查API

    缓冲区还可以复制,使用duplicate,asReadOnlyBuffer和slice三个方法来操作

    对于缓冲区来说,最基础也是最重要的就是ByteBuffer,它是操作系统及其I/O设备使用的基本数据类型,NIO中的Channel只支持ByteBuffer

    字节顺序

    非字节类型的缓冲区涉及到大端(big end)和小端字节顺序问题,Intel处理器使用小端,Moto,Sun和PowerPC的CPU架构都是用大端

    ByteBuffer和Java都是默认大端,调整可以使用CharBuffer的order方法来改,在ByteOrder中有常量来定以大端还是小端顺序

    直接缓冲区

    在创建缓冲区时,可以要求创建直接缓冲区,创建直接缓冲区的成本要比创建间接缓冲区高,但这可以使运行时环境直接在该缓冲区上进行较快的本机 I/O 操作。因为创建直接缓冲区所增加的成本,所以直接缓冲区只用于长生存期的缓冲区,而不用于短生存期、一次性且用完就丢弃的缓冲区。而且,只能在 ByteBuffer 这个级别上创建直接缓冲区,如果希望使用其它类型,则必须将 Buffer 转换成更具体的类型。

    视图缓冲区

    视图和原始缓冲区共享全部数据, 对一个缓冲区内的数据元素所做的改变会反映在另外一个缓冲区上, 并继承原始缓冲区的direct和readOnly属性. 但是具有独立的capacity, limit, position, mark,就像数据库中的视图概念一样

    数据元素视图

    ByteBuffer有个不太重要的机制就是以多字节数据类型的形式来存储byte数据,比如一起读4个byte来当成一个int

    存取无符号数据

    API中没提供相应的方法,自己写吧,注意精度问题就行,或者直接找个工具类的例子

    内存映射缓冲区

    通常都是直接存取内存的,只能通过FileChannel创建,用法和直接缓冲区类似

  • 相关阅读:
    JFinal 数据库“手动”事务(提交、回滚)
    redis有序集合性能 列表、集合、有序集合
    比特币的原理
    word2vec原理总结
    xgboost 算法总结
    GBDT学习笔记
    LR 算法总结--斯坦福大学机器学习公开课学习笔记
    sklearn的基本使用
    批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解
    Logistic回归计算过程的推导
  • 原文地址:https://www.cnblogs.com/Cratical/p/2650370.html
Copyright © 2011-2022 走看看