第19篇 rabbitmq ValueReader源码分析

本文深入探讨了ValueReader的工作原理及实现细节,包括其成员变量、构造方法、关键读取方法如readShortstr()和readLongstr()等,并介绍了如何通过TruncatedInputStream类限制输入流的读取范围。

上一篇我看一下ValueWriter方法,这节我熟悉一下逆过程,读取数据

1、成员变量

变量名默认描述
long INT_MASK0xffffffff掩码二进制表示(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()读取字符串转成LongString1
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、图示

  1. final LongString readLongstr()

    • image-20210618141106738
  2. readTable()

    • image-20210618143241363

    • 总结

      1. 读取table(map)的字节大小

      2. 将这个table的长度的约束下来,也就是重写FilterInputStream类型相关available, mark, read, reset,skip方法

      3. 读取map的key的值

      4. 读取map的value的值,value类型可能基本数据类型也可能是集合或数组,如果集合需要取出元素继续读取

      5. 如果key重复,以第一个key,value为主

      6. 特别说一下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 类

  • image-20210618145931324

3.1、成员变量

变量名默认值描述
final long limit限制最大长度(可以读取极限位置)
long counter0L当前已读取数据长度
long mark0L打个标签(可以重置到这个位置)

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、总结

  1. ValueReader和ValueWriter成对存在,一个是另个逆过程,主要是约定好不同类型数据如何进行编码写入到字节数组中
  2. 也熟悉了TruncatedInputStream类,它重写FilterInputStream类,其实的话就是增加了limit这个字段限制,相当于原来方法多一个条件判断了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值