软件包 org.jboss.netty.buffer

一个字节缓冲的抽象 - 表现一个底层二进制和文本消息的基础数据结构.

请参见:
          描述


接口摘要
ChannelBuffer 随机和顺序访问序列零个或多个字节.
ChannelBufferFactory 创建和池化ChannelBuffer的工厂.
ChannelBufferIndexFinder 定位数据在ChannelBuffer中的索引.
WrappedChannelBuffer 为缓冲包装和派生缓冲提供同一接口.
 

类摘要
AbstractChannelBuffer 一个ChannelBuffer的脚架实现.
AbstractChannelBufferFactory 一个ChannelBufferFactory的脚架实现.
BigEndianHeapChannelBuffer 一个big-endian的java堆缓冲.
ByteBufferBackedChannelBuffer 一个基于NIO ByteBuffer的缓冲.
ChannelBufferInputStream 一个从ChannelBuffer读取数据的InputStream.
ChannelBufferOutputStream 一个用来写数据到一个ChannelBufferOutputStream.
ChannelBuffers 使用分配新空间或包装、拷贝已存在的字节数组、字节缓冲和字符串来创建一个新的ChannelBuffer.
CompositeChannelBuffer 显示多个缓冲成一个单一的合并缓冲的虚拟缓冲.强烈建议使用 ChannelBuffers.wrappedBuffer(ChannelBuffer...)代替直接调用构造方法.
DirectChannelBufferFactory 为直接缓冲预分配一个大块和在需要时返回它的切片的ChannelBufferFactory.
DuplicatedChannelBuffer 一个简单转发所有数据访问请求到父缓冲的派生缓冲.强烈建议使用ChannelBuffer.duplicate()代替调用构造方法.
DynamicChannelBuffer 一个能根据容量需求增加的动态容量缓冲.强烈建议使用ChannelBuffers.dynamicBuffer(int)代替调用构造方法.
HeapChannelBuffer 一个Java堆缓冲的脚架实现.
HeapChannelBufferFactory 一个仅使用指定的容量分配一个堆缓冲的ChannelBufferFactory.
LittleEndianHeapChannelBuffer 一个little-endian的java堆缓冲.
ReadOnlyChannelBuffer 一个禁止任何对父缓冲写请求的派生缓冲.
SlicedChannelBuffer 一个只暴露父缓冲子部分的派生缓冲.
TruncatedChannelBuffer 一个隐藏父缓冲某个索引之后数据的派生缓冲.
 

软件包 org.jboss.netty.buffer 的描述

一个字节缓冲的抽象 - 表现一个底层二进制和文本消息的基础数据结构. Netty使用自己的缓冲API代替NIOByteBuffer表示字节的序列.该方法比使用ByteBuffer有着显著的优势.Netty中的缓冲类型, ChannelBuffer被设计用来解决ByteBuffer的底层问题和解决网络应用程序开发者的日常需要. 列出几个比较酷的特性:

扩展性

ChannelBuffer为实现快速协议提供丰富的优化操作.比如, ChannelBuffer为访问无符号值和查找一个缓冲中指定的字节序列提供各种各样的操作. 你也可以扩展或包装已有的缓冲类型,添加方便的存取.自定义缓冲类型总是实现 ChannelBuffer接口而不是引入不兼容的类型.

透明零拷贝

为了尽量提高网络应用程序的性能,你需要减少内存拷贝操作的数量.你可能有一组被用来切割和合并组合成一个完整消息的缓冲.Netty提供 一个允许不需要内存拷贝就可以把任意多个缓冲组合成一个新缓冲的组合缓冲.例如,一个消息一般由两部分组合而成:头部和消息体.在一个模块化的应用程序中,这两部分会在消息被发送时通过不同的模块被创建并组合.
 +--------+----------+
 | header |   body   |
 +--------+----------+
 
如果使用ByteBuffer,你必须创建一个新的大的缓冲并拷贝这两部分到该缓冲中.另外,你可以使用NIO执行一个收集的写操作,但它会限制你使用一个组合缓冲作为 ByteBuffer的数组,而不是一个单一缓冲,这样破坏了抽象和引入复杂的状态管理.而且,如果你不打算对一个NIO缓冲读或写时它一无是处.
 // 组合类型与组件类型不兼容.
 ByteBuffer[] message = new ByteBuffer[] { header, body };
 
相比之下,ChannelBuffer并没有这个警告,因为它是完全可扩展和具有内置的组合缓冲类型.
 // 组合类型与组件类型兼容.
 ChannelBuffer message = ChannelBuffers.wrappedBuffer(header, body);

 // 因此, 你甚至混合一个组合和一个原始缓冲来创建一个缓冲.
 ChannelBuffer messageWithFooter = ChannelBuffers.wrappedBuffer(message, footer);

 // 因为组合也是一个ChannelBuffer,所以你可以很容易的访问它的内容,而且即使你访问的区域超出多个组件,也可以像单一缓冲使用存取方法.这里跨越消息体和脚部的无符号整型会被获取.
 messageWithFooter.getUnsignedInt(
     messageWithFooter.readableBytes() - footer.readableBytes() - 1);
 

自动容量扩展

大多协议会定义可变长度的消息,这意味着直到构造消息之前都没有任何办法检测消息的长度,或者很难、很不方便计算长度的精确值.这就像当你要建一个String. 你会估算结果字符串的长度并让StringBuffer自动扩展.Netty允许你通过ChannelBuffers.dynamicBuffer()创建的动态缓冲做相同的事情.
 // 创建一个动态缓冲.内部为了避免内存空间的消耗会延迟创建真实缓冲.
 ChannelBuffer b = ChannelBuffers.dynamicBuffer(4);

 // 当尝试第一次写,内部会创建一个指定初始容量为4的缓冲.
 b.writeByte('1');

 b.writeByte('2');
 b.writeByte('3');
 b.writeByte('4');

 // 当写入的字节超过初始容量4时,内部缓冲会自动重新分配一个更大的容量.
 b.writeByte('5');
 

更好的性能

最常用ChannelBuffer的实现是一个很轻量的字节数组(如:byte[])包装 不像ByteBuffer, 它没有复杂的边缘检查和索引补偿,因此更容易的为JVM优化一个缓冲的访问. 更复杂的缓冲仅用于切片或组合缓冲,以及ByteBuffer.