我们知道ByteBuf通过读写两个索引分离,避免了NIO中ByteBuffer中读写模式切换时,需要flip等繁琐的操作。
今天就通过一段测试代码以及图例来直观的了解下ByteBuf中的readIndex, writeIndex以及capacity的概念。
先贴出测试代码:
1 public class ByteBuffTest { 2 ?3 ????public static void main(String[] args){ 4 ????????/*******************初始阶段**********************/ 5 ????????ByteBuf buf = Unpooled.buffer(100, 200); 6 ????????System.out.println("writable bytes " + buf.writableBytes()); 7 ????????System.out.println("readable bytes " + buf.readableBytes()); 8 ?9 ????????/*******************写入数据**********************/10 ????????String str = "write test";//UTF-8 英文字符占一个字节11 ????????int length = str.getBytes().length;//因此得到的字节长度为1012 ????????buf.writeBytes(str.getBytes());13 ????????System.out.println("writable bytes " + buf.writableBytes());14 ????????System.out.println("readable bytes " + buf.readableBytes());15 16 ????????/*******************读取数据*********************/17 ????????char c = (char)buf.readByte();//读取第一个字节,并转换成字符打印18 ????????System.out.println("c:" + c);19 ????????System.out.println("writable bytes " + buf.writableBytes());20 ????????System.out.println("readable bytes " + buf.readableBytes());21 22 ????????/*******************丢弃已读*********************/23 ????????buf.discardReadBytes();24 ????????System.out.println("writable bytes " + buf.writableBytes());25 ????????System.out.println("readable bytes " + buf.readableBytes());26 27 ????}28 }
然后是测试打印结果:
对上述过程用图例直观表示:
Netty(一):ByteBuf读写过程图解
原文地址:https://www.cnblogs.com/insaneXs/p/9303652.html