介绍netty中用于信息承载和通信的类称为ByteBuf。从名字就可以看出这是一个Byte缓冲区。那么ByteBuf有什么特点呢?让我们来看看。ByteBuf详解netty提供了一个io.netty.buffer包,里面定义了各种类型的ByteBuf及其派生类型。nettyBuffer的基础是ByteBuf类,它是一个抽象类。其他的Buffer类基本都是派生自这个类。这个类也定义了netty整体Buffer的基调。先看ByteBuf的定义:publicabstractclassByteBufimplementsReferenceCounted,Comparable{ByteBuf实现了两个接口,分别是ReferenceCounted和Comparable。Comparable是JDK自带的一个接口,意思是类之间可以进行比较。而ReferenceCounted代表对象的引用统计。当一个ReferenceCounted被实例化时,它的引用计数=1,每调用一次retain()方法,计数就会增加,调用release()方法就会减少计数。当计数减少到0时,对象将被释放。如果尝试访问已释放的对象,会报访问异常。如果一个对象实现了ReferenceCounted,而这个对象包含的其他对象也实现了ReferenceCounted,那么当容器对象的count=0时,它里面的其他对象也会通过调用release()方法释放。综上所述,ByteBuf是一个可以统计引用次数的可比较对象。他提供顺序或随机字节访问机制。注意,虽然JDK有自己的ByteBuffer类,但netty中的ByteBuf是ByteBuffer的重新实现。他们没有关系。创建BuffByteBuf是一个抽象类,不能直接实例化。虽然可以使用ByteBuf的子类来实例化,但是netty并不推荐。Netty推荐使用io.netty.buffer.Unpooled创建Buff。Unpooled是一个工具类,可以为ByteBuf分配空间、复制或封装操作。下面是创建多个不同ByteBuf的示例:importstaticio.netty.buffer.Unpooled.*;ByteBufheapBuffer=buffer(128);ByteBufdirectBuffer=directBuffer(256);ByteBufwrappedBuffer=wrappedBuffer(newbyte[128],newbyte[256]);ByteBufcopiedBuffer=copiedBuffer(ByteBuffer.allocate(128));上面我们看到了4种不同的buff构造方法,commonbuff、directBuffer、wrappedBuffer和copiedBuffer。普通buff是固定大小的heapbuff,而directBuffer是固定大小的directbuff。directbuff使用的是堆外内存,省去了向内核拷贝数据,所以效率比普通buff高。WrappedBuffer是对现有字节数组或字节缓冲区的封装。也算是一种观点。当底层数据发生变化时,Wrappedbuffer中的数据也会发生变化。Copiedbuffer是对现有字节数组、字节缓冲区或字符串的深度拷贝,所以它不同于wrappedBuffer,Copiedbuffer和原始数据之间不共享数据。随机访问Buff熟悉集合的朋友应该都知道,要想随机访问一个集合,必须要通过索引来访问。ByteBuf也是如此。可以使用capacity或者获取其capacity,然后使用getByte方法随机访问其中的字节,如下所示://RandomaccessByteBufbuffer=heapBuffer;for(inti=0;i