【转载】Java基本类型的Writable封装

Java基本类型的Writable封装

目前Java基本类型对应的Writable封装如表所示

屏幕快照 2016-03-08 上午10.44.07

所有这些Writable类都继承自WritableComparable。也就是说,它们是可比较的。

同时,它们都有get()set()方法,用于获得设置封装的值。

对整形(intlong)进行编码的时候,有固定长度格式IntWritableLongWritable)和可变长度格式VIntWritableVLongWritable)两种选择。

固定长度格式的整形,序列化后的数据是定长的,而可变长度格式则是用一种比较灵活的编码方式,对于数之比较小的整形,它们往往比较节省空间

同时,由于VIntwritableVLongWritable的编码规则是一样的,所以VIntwritable的输出可以用VLongWritable读入。

下面以VLongWritable为例,说明WritableJava基本类封装实现。

代码如下:

首先,每个Java基本类型Writale封装,其类的内部都包含一个对应基本类型的成员变量valueget()set()方法就是用来对该变量进行取值/赋值操作的。

Writable接口要求的readFields()write()方法,VIntWritable则是通过调用Writable工具类中提供的readVInt()writeVInt()读/写数据。方法readVInt()writeVInt()的实现也只是简单调用了readVLong()writeVLong(),所以,通过writeVInt()写的数据自然可以通过readVLong()读入。

读:


写:

writeVLong()方法实现了对整形数值的变长编码,它的编码规则如下:

如果输入的整数大于或等于-112同时小于或等于127,那么编码需要1字节

否则,序列化结果的第一个字节,保存了输入整数的符号和后续编码的字节数。

符号和后续字节数依据下面的编码规则(又一个规则):

  • 如果是正数,则编码值范围落在-113-120间(闭区间),后续字节数可以通过-(v+112)计算。
  • 如果是负数,则编码值范围落在-121-128间(闭区间),后续字节数可以通过-(v+120)计算。

后续编码将高位在前,写入输入的整数(除去前面全0字节)。代码如下:

猜你喜欢

转载自blog.csdn.net/llee84/article/details/80758056
今日推荐