`
dwj147258
  • 浏览: 192102 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ByteBuffer和设计模式

阅读更多

ByteBuf是Netty框架里最重要的类之一,简单的说,ByteBuf就是Java.nio.ByteBuffer的Netty版。

 

ByteBuf逻辑结构

正如类名所反映出来的,ByteBuf逻辑上就是一个byte容器。ByteBuf里的数据被两个指针划分为三个部分,如下图所示:

  • reader index前面的数据是已经读过的数据,这些数据可以扔掉
  • 从reader index开始,到writer index之前的数据是可读数据
  • 从writer index开始,为可写区域

正是因为这样的设计,ByteBuf可以同时读写数据(只要可读区域和可写区域都还有空闲空间),而java.nio.ByteBuffer则必须调用flip()方法才能从写状态切换到读状态。

 

ByteBuf API

ByteBuf提供了大量的方法,比较常用的有下面这些:

  • writeXxx(xxx value) 这组方法将不同类型的数据写到buf里,同时将writerIndex往前移适当的距离
  • readXxx() 这组方法从buf里读出某种类型的数据,同时将readerIndex往前移适当的距离
  • skipBytes(int length) 将readerIndex往前移指定的距离
  • setXxx(int index, xxx value) 这组方法将不同类型的数据写到buf的指定位置
  • getXxx(int index) 这组方法从buf的指定位置读出一个某种类型的数据
  • readerIndex()/writerIndex() 访问readerIndex和writerIndex
  • readerIndex(int)/writerIndex(int) 设置readerIndex和writerIndex
  • readableBytes() 返回可读区域的字节数
  • writableBytes() 返回可写区域的字节数
  • clear() 清除buf(把readerIndex和writerIndex都设为0)
  • discardReadBytes() 扔掉已读数据

值得一提的是,discardReadBytes()方法需要把可读数据移动到buf的开头,因此是个比较慢的操作。而clear()方法只是将两个指针清0,所以相对而言速度很快。

 

ByteBufAllocator - 抽象工厂模式

在Netty的世界里,ByteBuf实例通常应该由ByteBufAllocator来创建。ByteBuf和Allocator的关系如下图所示:

Allocator的buffer()方法创建ByteBuf实例,ByteBuf的alloc()方法返回创建自己的Allocator。ByteBufAllocator的实现使用了抽象工厂模式,如下图所示:

 

CompositeByteBuf - 组合模式

CompositeByteBuf可以让我们把多个ByteBuf当成一个大Buf来处理,ByteBufAllocator提供了compositeBuffer()工厂方法来创建CompositeByteBuf。CompositeByteBuf的实现使用了组合模式,如下图所示:

ByteBufInputStream - 适配器模式

ByteBufInputStream使用适配器模式,使我们可以把ByteBuf当做Java的InputStream来使用。同理,ByteBufOutputStream允许我们把ByteBuf当做OutputStream来使用。

比如说我们要实现一个自定义的消息协议,消息包括header和body两部分内容,body里放的是JSON字符串。那么就可以使用ByteBufInputStream来避免把ByteBuf里的字节拷贝到字节数组的开销:

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. private Object decodeMessage(ByteBuf bb) {  
  2.     // read header  
  3.     // bb.readXxx()...  
  4.       
  5.     // read body  
  6.     InputStreamReader reader = new InputStreamReader(new ByteBufInputStream(bb));  
  7.     return new Gson().fromJson(reader, JsonObject.class);  
  8. }  

 

 

ReadOnlyByteBuf - 装饰器模式

ReadOnlyByteBuf用适配器模式把一个ByteBuf变为只读,ReadOnlyByteBuf通过调用Unpooled.unmodifiableBuffer(ByteBuf)方法获得:

 

类似的ByteBuf适配器还包括:

 

ByteBuf - 工厂方法模式

前面也提到过了,我们很少需要直接通过构造函数来创建ByteBuf实例,而是通过Allocator来创建。从装饰器模式可以看出另外一种获得ByteBuf的方式是调用ByteBuf的工厂方法,比如:

  • ByteBuf#duplicate() 
  • ByteBuf#slice()

 

ByteBufProcessor - 访问者模式还是迭代器模式?

最后,ByteBuf提供了4个forEachByte()方法来对ByteBuf里的数据进行某种处理或查找,看起来像是访问者模式迭代器模式的混合:

  • public abstract int forEachByte(ByteBufProcessor processor);
  • public abstract int forEachByte(int index, int length, ByteBufProcessor processor);
  • public abstract int forEachByteDesc(ByteBufProcessor processor);
  • public abstract int forEachByteDesc(int index, int length, ByteBufProcessor processor);

分享到:
评论

相关推荐

    ByteBuffer.zip

    ByteBuffer.m和ByteBuffer.h文件的代码应该详细展示了这些功能的实现细节,包括数据结构设计、方法实现和错误处理等。通过研究这些源码,开发者可以更好地理解如何在Android上高效地处理字节序列,这对于构建高性能...

    JDK中的设计模式

    设计模式是在软件开发过程中总结出来的最佳实践,它们可以帮助开发者解决常见的问题并提高代码的可维护性和可扩展性。Java Development Kit (JDK) 中包含了许多设计模式的应用实例,这些实例不仅展示了设计模式的...

    Java NIO学习笔记——ByteBuffer用法

    在Java编程语言中,NIO(New Input/Output)是一个重要的特性,它为开发者提供了非阻塞I/O操作的能力,...通过熟练运用ByteBuffer,开发者可以设计出更高效的网络服务器、文件处理程序以及其他需要大量I/O操作的系统。

    深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别

    5. 高效的API:Mina ByteBuffer的API设计更贴近网络编程需求,提供了如writeInt、readUTF等方法,使得数据序列化和反序列化更便捷。 总的来说,Mina ByteBuffer是对Java NIO ByteBuffer的扩展和优化,它更加关注...

    线程池 + 工厂模式 + 工厂方法 + 单件模式

    在提供的`thread.zip`和`pattern.zip`文件中,可能包含了实现这些模式和概念的具体代码示例,通过学习和理解这些代码,你可以更深入地掌握这些技术,并应用到自己的项目中。记住,理解和实践是提升编程技能的关键,...

    Java实现多个wav文件合成一个的方法示例

    在Java中,单例设计模式是一种常用的设计模式,用于确保类的实例化只有一个。 知识点7:Java中的多线程编程 在上面的代码中,我们没有使用多线程编程,但是我们可以使用Java中的多线程编程来实现wav文件的并行合成...

    Java面试题大汇总(2021年Java面试题大全带答案)

    * Java设计模式:Java中的设计模式可以提高程序的可维护性、可扩展性和可读性。常见的Java设计模式包括Singleton模式、Factory模式、Adapter模式等。 * Java性能优化:Java中的性能优化可以提高程序的执行效率和响应...

    倾城服务器源码解读(一)

    在本篇解读中,我们将深入理解ByteBuffer的工作原理和应用场景。 ByteBuffer是一个可以容纳不同类型数据的可变容器,它允许程序员直接操作字节,而不是通过传统的字符或对象数组。这在处理二进制数据,如网络通信和...

    mina2资料-各种教程

    了解以上知识点是掌握Apache MINA的基础,通过提供的学习资料,如《Mina2.0学习笔记》、《Apache MINA入门基础》和《Apache MINA Server 2.0中文参考手册》等,可以深入学习MINA的API用法、设计原理和最佳实践。...

    [计算机项目]基于java的文件压缩与解压缩系统设计与实现(源代码+项目报告).zip

    设计模式如工厂模式、单例模式可能被用来组织代码,提高可维护性和复用性。 11. **源代码和项目报告**: 提供的项目包括源代码和项目报告,源代码展示了具体的实现细节,而项目报告可能涵盖了系统设计思路、技术...

    Netty5.0架构剖析和源码解读.pdf

    首先,Netty的架构设计是基于“反应器模式”的,这是一种处理高并发事件的常用设计模式。在Netty中,它通过EventLoop(事件循环)和Channel(通道)等核心组件实现了这一模式。EventLoop负责监听并处理I/O事件,而...

    JAVA文件传输(论文+源代码).rar

    10. **设计模式**:在实现文件传输服务时,可能会用到设计模式,如工厂模式创建Socket对象,单例模式管理ServerSocket,观察者模式用于更新和显示文件传输进度等。 源代码部分可能包含具体的实现细节,例如客户端...

    Tricks and Tips With NIO Using the Grizzly Framework

    通过介绍高效管理ByteBuffer、正确处理SelectionKey、推荐线程和缓冲区管理技巧以及高效的NIO/SSL实现等技巧,希望可以帮助开发者更好地应对实际开发中的挑战。这些技巧不仅可以提高应用程序的性能,还能降低系统的...

    java面试题

    10. **设计模式**:熟悉常见的设计模式,如单例、工厂、装饰器、代理、观察者、适配器等,并能结合实际问题应用这些模式。 11. **JVM原理**:理解类加载机制,虚拟机内存结构(堆、栈、方法区、本地方法栈等),...

    MINA源码分析,内涵类的讲解

    在这个“MINA源码分析,内涵类的讲解”中,我们将深入探讨MINA的核心组件和设计模式,以便更好地理解和利用这个强大的框架。 首先,我们需要了解MINA的基础架构。MINA的核心是`IoService`接口,它定义了服务端和...

    基于事件的 NIO 多线程服务器

    在Java编程领域,基于事件的NIO(非阻塞I/O)多线程服务器是一种高效的设计模式,尤其适用于处理大量并发连接。这种服务器利用了Java的NIO库,包括Selector、Channel和Buffer等核心组件,以非阻塞的方式管理网络通信...

    netty开源 源码,用于阅读学习

    通过深入学习Netty的源码,你可以了解其内部设计模式、线程模型、内存管理策略等高级话题,这对于理解和优化网络应用的性能至关重要。同时,Netty 的灵活性和可扩展性使得它能够轻松地适应各种自定义协议和复杂的...

    明华读卡器Java例程

    9. **软件设计模式**:为了提高代码的可维护性和复用性,例程可能应用了一些设计模式,比如工厂模式用于创建设备对象,单例模式确保读卡器的唯一实例,或者观察者模式用于监听读卡器状态变化。 总之,"明华读卡器...

    netty分享包括PPT和demo

    - Netty的设计模式和架构原理 - 高性能优化策略,如零拷贝、线程池配置等 - 通道和管道的配置与使用 - 异步事件驱动模型详解 - 实际应用场景和案例分析 5. **Netty Demo** - 通常会包含创建服务器和客户端的...

Global site tag (gtag.js) - Google Analytics