说明
io.netty.buffer.ByteBuf的数据索引从0开始。ByteBuf保存一个readerIndex和一个writerIndex变量。readerIndex用于读取操作,writerIndex用于写入操作。
0 <= readerIndex <= writerIndex <= capacity <= maxCapacity
示例
获取当前的readerIndex和writerIndex
package com.thb;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;public class Test {public static void main(String[] args) {ByteBuf buf = Unpooled.buffer();System.out.println(buf.getClass().getName());// 写入数据buf.writeByte(0x68);buf.writeByte(0x16);System.out.println("capacity: " + buf.capacity());System.out.println("maxCapacity: " + buf.maxCapacity());System.out.println("readerIndex: " + buf.readerIndex());System.out.println("writerIndex: " + buf.writerIndex());}
}
运行输出:
io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf
capacity: 256
maxCapacity: 2147483647
readerIndex: 0
writerIndex: 2
写入数据、读出数据过程readerIndex、writerIndex和可读字节数的变化
package com.thb;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;public class Test {public static void main(String[] args) {ByteBuf buf = Unpooled.buffer();System.out.println("开始readerIndex: " + buf.readerIndex()); System.out.println("开始writerIndex: " + buf.writerIndex());System.out.println("--------------------------------");// 写入数据buf.writeByte(0x68);System.out.println("写入一个字节后,readerIndex: " + buf.readerIndex()); System.out.println("写入一个字节后,writerIndex: " + buf.writerIndex()); System.out.println("--------------------------------");buf.writeByte(0x16);System.out.println("写入两个字节后,readerIndex: " + buf.readerIndex()); System.out.println("写入两个字节后,writerIndex: " + buf.writerIndex()); System.out.println("写入两个字节后,可读字节数: " + buf.readableBytes());System.out.println("--------------------------------");buf.readByte();System.out.println("读出一个字节后,readerIndex: " + buf.readerIndex()); System.out.println("读出一个字节后,writerIndex: " + buf.writerIndex());System.out.println("--------------------------------");buf.readByte();System.out.println("读出两个字节后,readerIndex: " + buf.readerIndex()); System.out.println("读出两个字节后,writerIndex: " + buf.writerIndex());System.out.println("读出两个字节后,可读字节数: " + buf.readableBytes());}
}
运行输出:
开始readerIndex: 0
开始writerIndex: 0
--------------------------------
写入一个字节后,readerIndex: 0
写入一个字节后,writerIndex: 1
--------------------------------
写入两个字节后,readerIndex: 0
写入两个字节后,writerIndex: 2
写入两个字节后,可读字节数: 2
--------------------------------
读出一个字节后,readerIndex: 1
读出一个字节后,writerIndex: 2
--------------------------------
读出两个字节后,readerIndex: 2
读出两个字节后,writerIndex: 2
读出两个字节后,可读字节数: 0