您的位置:首页 > 其它

NIO缓冲区的学习笔记,大致整理一下内容

2012-08-22 10:44 302 查看
缓冲区基础

缓冲区说白了就是一个包装后的数组,有一组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创建,用法和直接缓冲区类似
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: