介绍
Netty的ByteBuf数据位置索引是0开始的。
可以用ByteBuf的getByte(int index)方法从指定位置读出一字节,这个操作不会改变ByteBuf的readerIndex 或者 writerIndex 的位置。如果index小于0,或者index + 1大于ByteBuf的容量,就会抛出IndexOutOfBoundsException异常。
可以用ByteBuf的readByte()方法从当前readerIndex 读出一字节,并且将readerIndex 的值增加1。如果ByteBuf的readableBytes的值小于1,就会抛出IndexOutOfBoundsException异常。
可以使用ByteBuf的isReadable()方法判断是否有可读的数据。当(this.writerIndex - this.readerIndex) 的值大于0,isReadable()返回true。
代码举例
用getByte(int index)方法正常读取数据
代码:
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(1);
for (int i = 0; i < 1; i++) {
buf.writeByte(0x68);
}
for (int i = 0; i < buf.capacity(); i++) {
System.out.println(buf.getByte(i));
}
}
}
运行输出:
用getByte(int index)方法不正常读取数,据抛出异常
代码:
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(1);
for (int i = 0; i < 1; i++) {
buf.writeByte(0x68);
}
for (int i = 0; i < buf.capacity() + 1; i++) {
System.out.println(buf.getByte(i));
}
}
}
运行输出:
用readByte()方法正常读取数据–用readableBytes()判断可读的数据字节数
代码:
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(2);
for (int i = 0; i < 2; i++) {
buf.writeByte(0x68);
}
while (buf.readableBytes() > 0) {
System.out.println(buf.readByte());
}
}
}
运行输出:
用readByte()方法正常读取数据–用isReadable()判断是否有可读的数据
代码:
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(2);
for (int i = 0; i < 2; i++) {
buf.writeByte(0x68);
}
while (buf.isReadable()) {
System.out.println(buf.readByte());
}
}
}
运行输出: