2019独角兽企业重金招聘Python工程师标准>>>
之前写过一篇文章介绍过JDK里面InputStream的mark(readlimit)和reset()方法,Java IO:使用mark/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;
}