一、ByteBuffer的父类
ByteBuffer的父类是Buffer类,意思为缓冲区类,ByteBuffer为字节缓冲区,当然他也可以处理int, long, char等基本数据类型。
相比于Buffer类的其他继承类CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer 和 ShortBuffer,ByteBuffer类应用更广泛。
二、ByteBuffer的几个变量
position | 表示当前bytebuffer的数据指针的位置。因为ByteBuffer还可以做为一个数据解析器,比如getShort()可以读出来一个short类型的数据,因此position也是很重要的。 |
limit | 读取时可用作数据索引的上限(此时相当于数据的length – 1),但是写入时又不能有这个limit,否则会造成数据无法写入(写入时可设置limit = capacity) |
mark | 用于标记读取数据的起始位置,比如我们已经处理完成10个字节的数据,以后不用再管这10个字节,那么我们可以用mark()标记一下,然后配套的时候reset使position回到这个位置(比如后边的处理遇到了异常,或者遇到了不完整的数据)。 |
capacity | 容量,很简单啦,就是最大允许的字节数量。 |
三、几个要点
1、limit的设置,因为put和get系列函数只会影响position,不会影响limit,limit是数据的结尾位置,是相当的重要。
四、ByteBuffer类的方法
put(byte b) | 向ByteBuffer中写入一个字节,并且如果成功position+1 |
put(byte[] src) | 将参数中的byte数据写入bytebuffer中,并且如果成功position+src的长度 |
put(byte[] src, int offset, int length) | 将src数组中,在offset处开始,长度为length的数据写入到ByteBuffer中,并且如果成功,position+length |
compact() | 其实就是删除已读过的数据,将position到limit之间的数据移动到0和limit-position处,并将mark重置为-1,position放到数据结尾,总结一下,就是可以继续写数据了,但是不能读数据。 |
limit() | 获取当前的数据尾的位置(当然,前提是你设置过limit或者调用过flip) |
limit(int newLimit) | 设置数据的结尾位置。 |
rewind() | 执行后position = 0, mark = -1,数据内容不变。应用场景:新put数据后,使用rewind将指针位置恢复到起始位置。 |
reset() | 将position恢复到mark处的位置。 |
clear() | 重置ByteBuffer的 position = 0; limit = capacity; mark = -1,实际数据内容无变化,其实这个函数会比较少用,不如rewind的实用性强,因为rewind不会改变limit。 |
remaining() | 还未读取的数据limit – position,前提是你正确设置了limit的位置(所有数据的结尾位置)或者调用过flip()函数。 |
hasRemaining() | 是否还有未读取的数据,前提是你正确设置了limit的位置(所有数据的结尾位置)或者调用过flip()函数。 |
mark() | 将当前的position设备为mark(),mark要和reset配合使用。 |
discardMark() | 将mark的位置重置为-1,貌似很少会单独使用这个函数,而是用rewind或者clear来重置mark值 |
flip() | 其实这个函数的意思是,数据准备好了,可以读了,估计是reset、rewind、clear这些名字用的差不多了,起了一个这个难理解的名字,翻转,听着就让人晕。这个函数相当于下面两个函数的组合buf.limit(buf.position()); buf.rewind();。 |
get系列函数 |