NIO缓冲区的学习笔记,大致整理一下内容
2012-08-22 10:44
302 查看
缓冲区基础
缓冲区说白了就是一个包装后的数组,有一组API,有一些公共和私有的属性
任何缓冲区都有下面的属性:
一个新创建的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创建,用法和直接缓冲区类似
缓冲区说白了就是一个包装后的数组,有一组API,有一些公共和私有的属性
任何缓冲区都有下面的属性:
容量(capacity),缓冲区大小
限制(limit),第一个不应被读取或写入的字节的索引,总是小于容量。
位置(position),下一个被读取或写入的字节的索引,总是小于限制。
标记(mark),一个备忘位置,调用mark()来设定mark=position
四个属性遵循0<=mark<=position<=limit<=capacity限制(limit),第一个不应被读取或写入的字节的索引,总是小于容量。
位置(position),下一个被读取或写入的字节的索引,总是小于限制。
标记(mark),一个备忘位置,调用mark()来设定mark=position
一个新创建的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创建,用法和直接缓冲区类似
相关文章推荐
- 整理一下当年的学习笔记之:初步学习freemarker ,先做一个简单的HelloWord程序!
- Python学习笔记整理(六)Python中的字典(含字典嵌套内容)
- 整理一下当年的学习笔记之:JFreeChart初体验
- 产品经理学习笔记(15)-定期整理和总结反馈内容
- 整理一下当年的学习笔记之:ajax请求json和普通项
- 黑马程序员-SQL学习笔记整理 内容主要来源于 .NET培训课件
- 整理一下当年的学习笔记之:Jquery
- 整理一下当年的学习笔记之:poi导入导出
- 整理一下当年的学习笔记之:多个请求使用同一个Servlet
- 整理一下当年的学习笔记之:struts2
- NAT学习笔记,内容整理自网络
- Java反射简单内容整理(学习笔记)
- 整理一下当年的学习笔记之:SpringMVC的各种参数绑定方式
- Git 学习笔记整理
- JS数组学习笔记整理
- Web 在线文件管理器学习笔记与总结(5)修改文件内容
- Java特别学习笔记-全部内容(下载)
- Deep Learning(深度学习)学习笔记整理系列之(五)
- git学习笔记整理-10-分支切换及历史查看