writableBytes() 方法返回的字节数之外在加上 readerIndex

2024-08-21 09:41:10 浏览数 (3)

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);

git

1 人点赞