|
|||||||||
上一个软件包 下一个软件包 | 框架 无框架 |
请参见:
描述
接口摘要 | |
---|---|
ChannelBuffer | 随机和顺序访问序列零个或多个字节. |
ChannelBufferFactory | 创建和池化ChannelBuffer 的工厂. |
ChannelBufferIndexFinder | 定位数据在ChannelBuffer 中的索引. |
WrappedChannelBuffer | 为缓冲包装和派生缓冲提供同一接口. |
一个字节缓冲的抽象 - 表现一个底层二进制和文本消息的基础数据结构.
Netty使用自己的缓冲API代替NIOByteBuffer
表示字节的序列.该方法比使用ByteBuffer
有着显著的优势.Netty中的缓冲类型,
ChannelBuffer
被设计用来解决ByteBuffer
的底层问题和解决网络应用程序开发者的日常需要.
列出几个比较酷的特性:
StringBuffer
一样.flip()
方法.ByteBuffer
更快.ChannelBuffer
为实现快速协议提供丰富的优化操作.比如,
ChannelBuffer
为访问无符号值和查找一个缓冲中指定的字节序列提供各种各样的操作.
你也可以扩展或包装已有的缓冲类型,添加方便的存取.自定义缓冲类型总是实现
ChannelBuffer
接口而不是引入不兼容的类型.
+--------+----------+ | 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
.
|
|||||||||
上一个软件包 下一个软件包 | 框架 无框架 |