ByteBuffer使用总结
2016-01-28 15:31
281 查看
FW:http://blog.csdn.net/baple/article/details/12749005
目录:[ - ]
概述
使用
ByteBuffer内部字段
byte[] buff
position
mark
capacity
limit
图解
put
flip
get
clear
ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰。
《程序员的思维修炼》一本书讲过,主动学习,要比单纯看资料效果来的好,所以干脆写个详细点的文章来记录一下。
值得注意的是,ByteBuffer的读写模式是分开的,正常的应用场景是:往ByteBuffer里写一些数据,然后flip(),然后再读出来。
这里插两个Channel方面的对象,以便更好的理解Buffer。
那么,一个ByteBuffer的使用过程是这样的:
看到这里,一般都不太明白flip()干了什么事,先从ByteBuffer结构说起:
mark相关的方法主要是
目录:[ - ]
概述
使用
ByteBuffer内部字段
byte[] buff
position
mark
capacity
limit
图解
put
flip
get
clear
ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰。
《程序员的思维修炼》一本书讲过,主动学习,要比单纯看资料效果来的好,所以干脆写个详细点的文章来记录一下。
概述
ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而
DirectByteBuffer则使用了
unsafe的API进行了堆外的实现。这里只说HeapByteBuffer。
使用
ByteBuffer最核心的方法是put(byte)和
get()。分别是往ByteBuffer里写一个字节,和读一个字节。
值得注意的是,ByteBuffer的读写模式是分开的,正常的应用场景是:往ByteBuffer里写一些数据,然后flip(),然后再读出来。
这里插两个Channel方面的对象,以便更好的理解Buffer。
ReadableByteChannel是一个从Channel中读取数据,并保存到ByteBuffer的接口,它包含一个方法:
1 | public int read(ByteBuffer dst) throws IOException; |
WritableByteChannel则是从ByteBuffer中读取数据,并输出到Channel的接口:
1 | public int write(ByteBuffer src) throws IOException; |
1 | byteBuffer = ByteBuffer.allocate(N); |
2 | //读取数据,写入byteBuffer |
3 | readableByteChannel.read(byteBuffer); |
4 | //变读为写 |
5 | byteBuffer.flip(); |
6 | //读取byteBuffer,写入数据 |
7 | writableByteChannel.write(byteBuffer); |
ByteBuffer内部字段
byte[] buff
buff即内部用于缓存的数组。position
当前读取的位置。mark
为某一读过的位置做标记,便于某些时候回退到该位置。capacity
初始化时候的容量。limit
读写的上限,limit<=capacity。图解
put
写模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。flip
写完数据,需要开始读的时候,将postion复位到0,并将limit设为当前postion。get
从buffer里读一个字节,并把postion移动一位。上限是limit,即写入数据的最后位置。clear
将position置为0,并不清除buffer内容。mark相关的方法主要是
mark()(标记)和
reset()(回到标记),比较简单,就不画图了。
相关文章推荐
- 如何选择Html.RenderPartial和Html.RenderAction
- css 3d
- CSS 文字溢出处添加省略号
- 检测CSS属性 是否支持
- 【转】HTML5 jQuery图片上传前预览
- 项目前端部分小结
- js 默认行为取消
- 理解javascript中的MVC模式
- css 属性通配符选择器
- geolocation h5
- javascript函数库
- CSS fliter
- codeforces 620D D. Professor GukiZ and Two Arrays
- Newtonsoft.Json高级用法之枚举中文转义
- 前端——px,em,rem区别
- HTML5:表格
- CSS3下的147个颜色名称及对应颜色值
- jQuery对象和DOM对象互转
- JQuery取消和注册对象Click事件同时防止多播委托
- JS乘法口诀表(一行代码)