图解ByteBuffer
概述
ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而DirectByteBuffer则使用了unsafe的API进行了堆外的实现。这里只说HeapByteBuffer。
使用
ByteBuffer最核心的方法是put(byte)和get()。分别是往ByteBuffer里写一个字节,和读一个字节。
值得注意的是,ByteBuffer的读写模式是分开的,正常的应用场景是:往ByteBuffer里写一些数据,然后flip(),然后再读出来。
这里插两个Channel方面的对象,以便更好的理解Buffer。
ReadableByteChannel是一个从Channel中读取数据,并保存到ByteBuffer的接口,它包含一个方法:
<!-- lang: java -->public int read(ByteBuffer dst) throws IOException;
WritableByteChannel则是从ByteBuffer中读取数据,并输出到Channel的接口:
<!-- lang: java -->public int write(ByteBuffer src) throws IOException;
那么,一个ByteBuffer的使用过程是这样的:
<!-- lang: java -->byteBuffer = ByteBuffer.allocate(N);
//读取数据,写入byteBuffer
readableByteChannel.read(byteBuffer);
//变读为写
byteBuffer.flip();
//读取byteBuffer,写入数据
writableByteChannel.write(byteBuffer);
看到这里,一般都不太明白flip()干了什么事,先从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()(回到标记),比较简单,就不画图了。
- Liora Rosin & Golan Levi:在北京驾车看洛杉矶的落日
- iphone/ipad/itouch进入DFU模式最简单的操作办法
- 微信小程序for循环里条件判断
- objective-C 的OOP(下)-类(static)方法、实例方法、overwrite(覆写)、属性(property)
- 你真的会玩SQL吗?删除重复数据且只保留一条
- activity结束之后刷新之前的activity的内容
- 徐扬生:与机器人共建未来社会
- Aerospike在实时竞价广告中的应用
- objective-C 的Hello World!
- objective-C 的代码文件组织
- objective-C 的OOP(上)--类定义、继承及方法调用
- jQuery打造智能提示插件二(可编辑下拉框)
- Nicholas Christakis:朋友多是由基因决定的?
- WPF中的MatrixTransform
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解Linux系统中虚拟设备文件的各种实用用法
- 适配android7.0获取文件的Uri的方法
- Android RecyclerView使用方法详解
- 详解bash中的初始化机制
- Android音频系统AudioTrack使用方法详解
- 深入解析Android中的setContentView加载布局原理
- Android编程之自定义ProgressBar示例
- Android自动获取输入短信验证码库AutoVerifyCode详解
- Android编程实现对话框形式进度条功能示例
- Android ButtonOnClick事件的写法总结
- Android 自定义弹出菜单和对话框功能实例代码
- linux文件管理命令实例分析【权限、创建、删除、复制、移动、搜索等】
- Android编程操作手机通讯录的方法示例
- Android中oncreate中获得控件高度或宽度的实现方法
- Android编程自定义对话框(Dialog)位置及大小的方法