上一篇我看一下ValueWriter方法,这节我熟悉一下逆过程,读取数据
- ValueReader是ValueWriter逆过程,读取流中数据
- 对于类型简写可以参考rabbitmq ValueWriter源码分析
1、成员变量
| 变量名 | 默认 | 描述 |
|---|---|---|
| long INT_MASK | 0xffffffff | 掩码二进制表示(1111 1111 1111 1111 1111 1111 1111 1111) |
| final DataInputStream in |
2、方法
| 方法名 | 描述 | 图示 |
|---|---|---|
| ValueReader(DataInputStream in) | 只有一个构造方法 | |
| final String readShortstr() | 读取一个short字符串 1、先读取in.readUnsignedByte() 长度 2、in.readFully(b) 3、使用utf-8编码转成字符串 | |
| final LongString readLongstr() | 读取字符串转成LongString | 1 |
| final int readShort() | 读取short | |
| final int readLong() | 读取int | |
| final long readLonglong() | 读取long | |
| final int readOctet() | 读取无符号readUnsignedByte | |
| Date readTimestamp() | 读取时间戳,读取long *1000 | |
| Map<String, Object> readTable() | 读取table也就map数据 | 2 |
2.1、图示
-
final LongString readLongstr()
-
readTable()
-

-
总结
-
读取table(map)的字节大小
-
将这个table的长度的约束下来,也就是重写FilterInputStream类型相关available, mark, read, reset,skip方法
-
读取map的key的值
-
读取map的value的值,value类型可能基本数据类型也可能是集合或数组,如果集合需要取出元素继续读取
-
如果key重复,以第一个key,value为主
-
特别说一下BigDecimal怎么读取的,代码片段如下
-
// 首先读取scale int scale = in.readUnsignedByte(); // 读取具体数字 4字节数组 byte [] unscaled = new byte[4]; in.readFully(unscaled); //创建BigDecimal对象 value = new BigDecimal(new BigInteger(unscaled), scale);
-
-
-
3、TruncatedInputStream 类
3.1、成员变量
| 变量名 | 默认值 | 描述 |
|---|---|---|
| final long limit | 限制最大长度(可以读取极限位置) | |
| long counter | 0L | 当前已读取数据长度 |
| long mark | 0L | 打个标签(可以重置到这个位置) |
3.2、方法
| 方法名 | 描述 | 图示 |
|---|---|---|
| TruncatedInputStream(InputStream in, long limit) | 多加一个限制limit属性 | |
| int available() | 【重写】剩余可读的长度,Math.min(limit-counter, super.available()) | |
| void mark(int readlimit) | 【重写】mark当前位置,同时设置读取限制 | |
| int read() | 【重写】读取int值 | |
| int read(byte[] b, int off, int len) | 【重写】读取数据到字节数组中 | |
| void reset() | 【重写】重置到mark位置 | |
| long skip(long n) | 【重写】跳过不读取长度 |
4、总结
- ValueReader和ValueWriter成对存在,一个是另个逆过程,主要是约定好不同类型数据如何进行编码写入到字节数组中
- 也熟悉了TruncatedInputStream类,它重写FilterInputStream类,其实的话就是增加了limit这个字段限制,相当于原来方法多一个条件判断了。
本文深入探讨了ValueReader的工作原理及实现细节,包括其成员变量、构造方法、关键读取方法如readShortstr()和readLongstr()等,并介绍了如何通过TruncatedInputStream类限制输入流的读取范围。


456

被折叠的 条评论
为什么被折叠?



