ByteBuffer封装了一个实现类,可以方便的把java基础数据类型(short, int, long, float, double)转换成byte数组形式,反之亦然;做二进制数据的生成和读取时,会特别有用。
实现上,整型数可以通过移位获取各个字节,然后写到byte数组中即可;而浮点型没办法直接获得字节数据,只能通过Float.floatToIntBits(详细参见java api)类似的方法,转换成IEEE 754的二进制表达,变成一个int型,然后再写入byte数组中。读取与此类似。ByteBuffer有两个继承类,HeappedByteBuffer和DirectByteBuffer,api上针对这两种有很详细的描述,我这里说一下实现。
java堆的ByteBuffer
HeappedByteBuffer是通过ByteBuffer.allocate获得的,其内部的byte数组,通过new byte[]获得,所以数据都在java的堆(Heap)中。之后的各种get/put方法都是在操作这个堆上的byte数组,贴两段示例代码:
ByteBuffer中的getInt方法, 主要处理位置相关,实际的工作在Bits中实现。
public int ByteBuffer::getInt() {
return Bits.getInt(this, ix(nextGetIndex(4)), bigEndian);
}
Bits中的getInt实现,先拿到4个比特,然后makeInt通过位移构建一个int。
static int Bits::getIntL(ByteBuffer bb, int bi) {