rewind()
position
置0:可重读Buffer中的所有数据
limit
不变,仍表示能从Buffer中读取多少个元素
clear() && compact()
读完Buffer中的数据后,需要让Buffer准备再次被写入。
这通过clear()或compact()完成。
clear()
position
置0
limit
置成 capacity
的值
即 Buffer 被清空。
Buffer中的数据并未清除,只是这些标识位告诉我们可以从哪开始往Buffer写数据。
若Buffer中尚有未读数据,调用clear(),数据将“被遗忘”,即不再有任何标记会告诉你哪些数据被读过,哪些还没有。
若Buffer中仍有未读的数据且后续还想读这些数据,但你需要先写一些数据,那么使用compact()。
compact()
将所有未读数据拷贝到Buffer起始处。
- 然后将
position
设到最后一个未读元素正后面 limit
属性依然像clear()方法一样,设置成capacity
。
现在Buffer准备好写数据了,但不会覆盖未读数据。
ByteBuf 的状态图
mark()与reset()方法
通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个position。例如:
buffer.mark(); // call buffer.get() a couple of times, e.g. during parsing. buffer.reset();
equals()与compareTo()方法
可以使用equals()和compareTo()方法比较两个Buffer。
equals()
当满足下列条件时,表示两个Buffer相等:
- 有相同的类型(byte、char、int等)
- Buffer中剩余的byte、char等的个数相等
- Buffer中所有剩余的byte、char等都相同。
equals只是比较Buffer的一部分,不是每一个在它里面的元素都比较。实际上,它只比较Buffer中的剩余元素。
compareTo()
compareTo()方法比较两个Buffer的剩余元素(byte、char等), 如果满足下列条件,则认为一个Buffer“小于”另一个Buffer:
- 第一个不相等的元素小于另一个Buffer中对应的元素
- 所有元素都相等,但第一个Buffer比另一个先耗尽(第一个Buffer的元素个数比另一个少)。
剩余元素是从 position到limit之间的元素。
参考
- http://tutorials.jenkov.com/java-nio/buffers.html
- 《Java的事件驱动网络编程》