之前写过一篇文章介绍过JDK里面InputStream的mark(readlimit)和reset()方法,。相应的,可以通过调用markReaderIndex()
/markWriterIndex()
/resetReaderIndex()
和resetWriterIndex()
来标记和重置ByteBuf的readerIndex和writerIndex。
除此之外,还可以调用readerIndex(int)
/writerIndex(int)
来将索引移动到指定位置。如果尝试设置到一个无效的位置将会抛出IndexOutOfBoundsException
。
在调用clear()
方法之前:
+-------------------+------------------+------------------+ | discardable bytes | readable bytes | writable bytes | | | (CONTENT) | | +-------------------+------------------+------------------+ | | | | 0 <= readerIndex <= writerIndex <= capacity
After clear()
:readerIndex和writerIndex都被设置成了0,但是不会清除内存中的内容。
+---------------------------------------------------------+ | writable bytes (got more space) | +---------------------------------------------------------+ | | 0 = readerIndex = writerIndex <= capacity
AbstractByteBuf#clear 代码如下:可以看到,只是将两个索引重置为0,没有对内存进行擦除操作。
public ByteBuf clear() { readerIndex = writerIndex = 0; return this;}