ByteBuf
ByteBuf作为java NIO中ByteBuffer的Netty版,其语义与ByteBuffer相同,只是操作方式更加丰富
基本操作
ByteBuf buf = Unpooled.buffer(128);
List<Object> objects = new LinkedList<>();
objects.add(buf.capacity());
objects.add(buf.isReadable());
objects.add(buf.isDirect());
objects.add(buf.isReadable());
objects.forEach(System.out::println);
buf.writeByte('a');
buf.writeByte('b');
buf.writeByte('c');
System.out.println(buf.writerIndex());
System.out.println(buf.readerIndex());
System.out.println(buf.readableBytes());
assert 'a' == buf.readByte();
assert 'b' == buf.readByte();
assert 'c' == buf.readByte();
buf.readerIndex(0);
buf.slice(0,3);
buf.release();
ByteProcess
ByteBuf buf = Unpooled.buffer(128);
buf.writeCharSequence("abc d \re \n f \b c! ?", StandardCharsets.UTF_8);
int i = 0;
int last = 0;
while (-1 != (i = buf.forEachByte(b -> b != 'c'))) {
if (i > last) {
byte[] bytes = new byte[i - last];
buf.readBytes(buf,i,last);
System.out.println(new String(bytes));
buf.readerIndex(i + 1);
}
last = i;
}
buf.readerIndex(0);
buf.forEachByte(ByteProcessor.FIND_LF);
UnPooled
byte[] bytes1 = "hello".getBytes(StandardCharsets.US_ASCII);
byte[] space = " ".getBytes(StandardCharsets.US_ASCII);
byte[] bytes2 = "world".getBytes(StandardCharsets.US_ASCII);
ByteBuf buf = Unpooled.wrappedBuffer(bytes1,space,bytes2);
int len = bytes1.length + bytes2.length + space.length;
byte[] helloWorld = new byte[len];
buf.readBytes(helloWorld,0,len);
System.out.println(new String(helloWorld));
buf.readerIndex(0);
ByteBuf buf3_14 = Unpooled.copyFloat(3.14f);
ByteBuf buf2 = Unpooled.wrappedBuffer(buf,buf3_14);
buf2.readerIndex(len);
assert "3.14" == buf2.readFloat() + "";
}