第18篇和第19篇了解最基础的ValueWriter 和 ValueReader对不同类型的数据编码的字节数组中有一定了解,我们现在往上看一下使用ValueWriter和ValueReader的类,我先看一下ContentHeaderPropertyReader和ContenHeaderPropertyWriter
文章目录
1、ContentHeaderPropertyReader
- 其实对ValueReader封装
1.1、成员变量
变量名 | 默认值 | 描述 |
---|---|---|
final ValueReader in | 值读取类 | |
int flagWord | 1 | 当前字段标志位 |
int bitCount | 15 | 当前flag位置计算 |
1.2、方法
方法名 | 描述 | 图示 |
---|---|---|
ContentHeaderPropertyReader(DataInputStream in) | 构造方法 | |
boolean readPresence() | 读取当前二进制位的属性,有点类型布隆过滤器 | 1 |
void finishPresence() | 表示flagWord第0位不会是1,1只有在初始化才有 | |
String readShortstr | 读取short字符串 | |
LongString readLongstr() | 读取字符串转换成LongString | |
Integer readShort() | 直接读取short值 | |
Integer readLong() | 实际读取的int值 | |
Long readLonglong() | 读取long值 | |
Map<String, Object> readTable() | 读取map值 | |
int readOctet() | 读取byte值(无符号) | |
Date readTimestamp() | 读取时间戳 |
1.3、flagWord描述
-
-
总结
- flagWord其实就是利用一个int类型二进制位 ,0 表示该值不存在,1表示该值存在
- 由于目前是14个字段所以利用是, 2-15位二进制表示。
- 具体某一位表示什么字段值是否存在,参看字段编号
1.4、图示
- boolean readPresence
- 总结
- 首先读取flagWord 这个是判断这属性是否存在,0表示不存在,1表示存在,利用二进制的特性
- 位数移动首先从移动15位开始一直到移动2位结束,bitCount进行计数
- 移动对应位置进行&运算即可
2、ContentHeaderPropertyWriter 类
- 其实仔细看一下就会发现,类似ValueWriter和ValueReader关系,我们想办法把属性写到字节数组中
- 由ContentHeaderPropertyWriter可以知道其实它属性是14个,写属性过程如下
- 先定义一个flagWord,遍历14个属性,如果属性存在,就在flagWord位置上填1否则就填0
- 属性全部遍历完之后,将flagWord写到流中(字节数组中)
- 然后在按顺序依次写入对应属性值即可
2.1、成员变量
变量值 | 默认值 | 描述 |
---|---|---|
final ValueWriter out | 值写出 | |
int flagWord | 0 | 表示header相关属性是否存在 |
int bitCount | 0 | 计数属性个数,跟移位有关 |
2.2、方法
方法名 | 描述 | 图示 |
---|---|---|
ContentHeaderPropertyWriter(DataOutputStream out) | 构造方法 | |
void writePresence(boolean present) | 写属性标志位是否存在,形成flagWord | 1 |
void finishPresence() | 将flagWord写到流中 | |
void writeShortstr | 写short字符串 | |
void writeLongstr | 写比较长的字符串 | |
void writeShort(Integer s) | 写short值 | |
void writeLong(Integer l) | 写int值 | |
void writeLonglong(Long ll) | 写long值 | |
void writeTable(Map<String, Object> table) | 写table值 | |
void writeOctet(Integer octet) | 写类型简写(无符号byte) | |
void writeOctet(int octet) | 写类型简写(无符号byte) | |
void writeTimestamp(Date timestamp) | 写时间戳 |
2.3、图示
- writePresence(boolean present)
- 总结
- 这情况分支应该不会走,目前来说只有14属性,不可能到等于15
- 如果属性存在进行移位,使用二进制或运算,对位置填上1
- 该方法执行完之后,执行finishPresence写入flagWord的值
3、总结
- 主要了解一下ContentHeader如何写属性,最关键就是flagWord字段,来判断某个属性是否存在
- 关键方法也就是writePresence() 和finishPresence()方法设置flagWord和写flagWord字段