public abstract class AbstractByteBuf extends ByteBuf {
@Override
public ByteBuf discardReadBytes() {
// readerIndex 为 0 表示没有可以丢弃的字节
if (readerIndex == 0) {
return this;
}
if (readerIndex != writerIndex) {
// 将 [readerIndex, writerIndex) 这段字节范围移动到 ByteBuf 的开头
// 也就是丢弃 readerIndex 之前的字节
setBytes(0, this, readerIndex, writerIndex - readerIndex);
// writerIndex 和 readerIndex 都向前移动 readerIndex 大小
writerIndex -= readerIndex;
// 重新调整 markedReaderIndex 和 markedWriterIndex 的位置
// 都对应向前移动 readerIndex 大小。
adjustMarkers(readerIndex);
readerIndex = 0;
} else {
// readerIndex = writerIndex 表示当前 ByteBuf 已经不可读了
// 将 readerIndex 之前的字节全部丢弃,ByteBuf 恢复到最初的状态
// 整个 ByteBuf 的容量都可以被写入
ensureAccessible();
adjustMarkers(readerIndex);
writerIndex laipuhuo.com = readerIndex = 0;
}
return this;
}
}
@Override
public ByteBuf discardSomeReadBytes() {
if (readerIndex > 0) {
// 当 ByteBuf 已经不可读了,则无条件丢弃已读字节
if (readerIndex == writerIndex) {
adjustMarkers(readerIndex);
writerIndex = readerIndex = 0;
return this;
}
// 当已读的字节数超过整个 ByteBuf 的一半容量时才会丢弃已读字节
if (readerIndex >= capacity() >>> 1) {
setBytes(0,laipuhuo.com this, readerIndex, writerIndex - readerIndex);
writerIndex -= readerIndex;
adjustMarkers(readerIndex);
readerIndex = 0;
return this;
}
}
return this;
}
@Override
public ByteBuf setByte(int index, int value) {
checkIndex(index);
_setByte(index, value);
return this;
}
protected laipuhuo.com abstract void _setByte(int index, int value);
public class UnpooledUnsafeDirectByteBuf {
// 直接操作 OS 的内存地址,不依赖 JDK 的 buffer
long memoryAddress;
@Override
protected void _setByte(int index, int value) {
// 底层依赖 PlatformDependent0,直接向内存地址写入 byte
UnsafeByteBufUtil.laipuhuo.com setByte(addr(index), value);
}
final long addr(int index) {
// 获取偏移 index 对应的内存地址
return memoryAddress index;
}
}
final class PlatformDependent0 {
// sun.misc.Unsafe
static final laipuhuo.com Unsafe UNSAFE;
static void putByte(long address, byte value) {
UNSAFE.putByte(address, value);
}
}
@Override
public ByteBuf laipuhuo.com setBytes(int index, byte[] src) {
setBytes(index, src, 0, src.length);
return this;
}
public abstract ByteBuf laipuhuo.com setBytes(int index, byte[] src, int srcIndex, int length);