`
jlcon
  • 浏览: 172264 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Mina之IoBuffer

阅读更多

原文:http://mina.apache.org/iobuffer.html

 

IoBuffer用于Mina应用程序。

 

这是一个JDK IoBuffer的替代品,Mina有两个原因没有直接使用:

  • 在填充数据的时候没有提供令人满意的getters 和putters 方法,即get/putString, 和get/putAsciiInt()
  • 很难写入一个可变长的数据到固定大小的Buffer中。

这些将在Mina3中得到改进。Mina从nio ByteBuffer继承实现的自己的IoBuffer包的的主要原因是让buffers能够可扩展。这是一个很坏的决定。Buffers仅仅只是一个buffers:一个在数据使用前存放零时数据的地方。有很多其他的解决方案存在,例如定义一个继承于NIO ByteBuffers列表的类(like defining a wrapper which relies on a list of NIO ByteBuffers)来代替拷贝一个buffer到一个更大容量的对象,仅仅因为我们想扩张buffer的容量。

 

IoBuffer的操作

分配一个新的Buffer

IoBuffer是一个抽象类,因此不能直接实例化。要使用IoBuffer我们需要两个allocate() 方法。

 

// 使用指定大小实例化一个新的Buffer, 并且可以定义他的类型 (direct 或 heap) 
public static IoBuffer allocate(int capacity, boolean direct) 
// 使用指定大小实例化一个新的Buffer 
public static IoBuffer allocate(int capacity)

 

 allocate()方法拥有1个或2个参数,示例第一个拥有两个参数:

  • capacity - Buffer的容量
  • direct - Buffer的类型,ture获得一个单一的Buffer,false获得多个Buffer

默认的Buffer是由SimpleBufferAllocator创建。

另外一下代码也可以达到同样的效果

 

 

// 设置创建默认Buffer的类型,这里是heap.
 IoBuffer.setUseDirectBuffer(false); 
// 新建一个Buffer 
IoBuffer buf = IoBuffer.allocate(1024);

 

使用第二种方法之前你必须先指定Buffer类型,否则默认将是Heap。

 

创建自动扩展的Buffer

使用Java NIO的API创建一个可扩展的buffer并不容易,因为要为网络程序填充超过固定大小数据。因此IoBuffer引入autoExpand 属性,他能自动扩展Buffer限制了的容量大小。

IoBuffer buffer = IoBuffer.allocate(8);
buffer.setAutoExpand(true);

buffer.putString("12345678", encoder);
       
// 往Buffer里加入更多内容
buffer.put((byte)10);

 在上例中如果encoder的数据比8字节大buffer的大小将重新设置。Buffer大小将会成倍增长,容量会在字符串最后的位置开始增加。其表现和StringBuffer非常相像。

 

创建自动缩减的Buffer

 

有一种情况就是为了节省内存而从Buffer中释放掉不使用的资源。IoBuffer提供了autoShrink 属性来达到这目的。如果autoShrink 设置启用,当调用compact() 方法后IoBuffer的容量将会减少一半,只有四分之一或者更少的容量会被用到。手动减少容量使用shrink() 方法。

 

IoBuffer buffer = IoBuffer.allocate(16);
buffer.setAutoShrink(true);
buffer.put((byte)1);
System.out.println("Initial Buffer capacity = "+buffer.capacity());
buffer.shrink();
System.out.println("Initial Buffer capacity after shrink = "+buffer.capacity());

buffer.capacity(32);
System.out.println("Buffer capacity after incrementing capacity to 32 = "+buffer.capacity());
buffer.shrink();
System.out.println("Buffer capacity after shrink= "+buffer.capacity());

 初始化容量是16字节,设置autoShrink属性为true

看看输出如下:

 

Initial Buffer capacity = 16
Initial Buffer capacity after shrink = 16
Buffer capacity after incrementing capacity to 32 = 32
Buffer capacity after shrink= 16

从输出结果我们可知:

  • 初始化Buffer的容量是16字节,也是Buffer的最小容量。
  • 调用shrink()方法后,容量依然是16字节,容量永远不会小于最小容量。
  • 当增加体积到32字节,体积变为32.
  • 调用shrink()方法后,容量减少到16字节,删去了多余的存储空间。

 Buffer的分配

IoBufferAllocater专门Buffer的分配和管理。实现IoBufferAllocater接口后可控制Buffer的分配管理。Mina的以下类实现了IoBufferAllocater接口:

  • SimpleBufferAllocator(默认)- 任何时间创建一个新的Buffer
  • CachedBufferAllocator - 当buffer需要复用时缓存buffer

 

分享到:
评论
2 楼 yakczh 2014-02-16  
http://mina.apache.org/mina-project/userguide/ch8-iobuffer/ch8-iobuffer.html
1 楼 Cn_kavin 2010-07-12  
直接翻译啊,我还以为有什么进展呢

相关推荐

    mina core 包

    org.apache.mina.core.buffer.IoBuffer mina core 包

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    在Mina中,我们可以利用BufferedIoFilter或者IoBuffer来传输文件,包括图片。首先,我们需要将图片文件读取到内存中的IoBuffer,然后通过过滤器链传递给远程客户端。在这个过程中,可以实现数据压缩、加密等额外...

    mina学习的最佳代码

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专为开发高性能和高可用性的网络应用程序而设计。MINA提供了高级通信抽象,如NIO(非阻塞I/O)和事件驱动的模型,使开发者...

    Mina 2.0 User Guide(Mina 2.0 用户指南)

    Chapter 10 - IoBuffer Chapter 11 - Codec Filter Chapter 12 - Executor Filter Chapter 13 - SSL Filter Chapter 14 - Logging Filter Part III - MINA Advanced Chapter 15 - Debugging Chapter 16 - State...

    MINA_API+MINA_DOC+mina

    它可能还会涉及如何配置和使用MINA的各种组件,如Buffer、Filters、Protocols等,帮助开发者更好地理解和应用MINA到实际项目中。 最后,`Apache_Mina_Server_2.0中文参考手册V1.0.pdf` 是MINA服务器端的中文参考...

    mina-2.0.4 source code

    - **Buffer**:MINA使用IoBuffer作为缓冲区,它提供了高效的读写操作,并且支持自动扩容和预读写。 - **Filter**:过滤器是MINA中的关键组件,它们可以链式调用,用于数据的预处理和后处理,如压缩、加密、身份...

    Mina2.0阅读源码笔记(很值得一看)

    - IoBuffer 是 Mina 中用于数据存储和传输的核心类,它是对 Java NIO ByteBuffer 的封装和增强。 - **IoBuffer vs ByteBuffer**: IoBuffer 提供了更多便于操作的功能,比如自动扩容、直接内存分配等特性,使得数据...

    Java学习之IO总结及mina和netty

    Java NIO(New IO)引入了通道(Channel)和缓冲区(Buffer)的概念,提高了IO性能,并支持非阻塞IO。 MINA(Multipurpose Infrastructure for Network Applications)是一个高度可扩展且高性能的网络应用开发框架...

    mina 断包,粘包问题解决

    1. 缓冲区管理:Mina使用IoBuffer作为数据缓冲区,允许开发者对数据的读写进行精细控制。通过设置合适的缓冲区大小和正确地读写数据,可以有效防止数据丢失或交错。 2. 自定义编码解码器:Mina支持用户自定义编码器...

    Mina2中文文档

    - **IoBuffer详解**:IoBuffer是Mina用于高效内存管理的数据结构,本章节详细讲解了其内部机制和使用方法。 #### Chapter 9 - 编解码器过滤器 - **编解码器**:介绍如何使用Mina提供的编解码器过滤器对网络数据...

    Apache_MINA_2_用户指南.pdf

    * IoBuffer 是 MINA 中的一个核心组件,负责管理 I/O 缓存。 * IoBuffer 提供了一个灵活的架构,使得开发者可以轻松地构建高性能的 I/O 操作。 Chapter 9 - 编解码器过滤器 本章节介绍了 编解码器过滤器 的基本概念...

    mina开发实例

    4. **缓冲区管理**:Mina使用IoBuffer作为缓冲区对象,可以方便地进行读写操作,支持字节和对象之间的转换。 5. **性能优化**:Mina提供了池化的缓冲区和连接管理机制,以及心跳检测和空闲策略,以优化网络通信性能...

    mina-core-2.0.1.jar,apache-mina-2.0.1

    4. **Buffer**:MINA 提供了 ByteBuffer 和 IoBuffer 两种缓冲区,用于在网络通信中高效地读写数据。 **MINA 2.0.1 版本特点:** 1. **性能优化**:在 2.0.1 版本中,MINA 进行了多方面的性能提升,包括更快的数据...

    MINA TCP简单通信实例

    MINA提供了 IoBuffer 类,用于高效地存储和操作网络数据。你可以将数据写入Buffer,然后通过Session的write方法发送出去;接收数据时,MINA会自动将接收到的数据填充到Buffer中,供你读取。 在“MINA TCP简单通信...

    springboot整合mina

    public Object decode(IoBuffer in) throws Exception { int length = in.getInt(); if (in.getRemaining() ) { // 没有足够的数据,等待更多数据到达 return null; } byte[] data = new byte[length]; in....

    Apache_Mina2.0学习笔记

    最近使用Mina开发一个Java的NIO服务端程序,...IoBuffer常用方法: 19 Demo1:模拟根据文本换行符编解码 20 Demo2:改进Demo1的代码 22 Demo3:自定义协议编解码 31 3.IoHandler接口 50 三. Mina实例 50 四. 其他 50

    mina自定义编码解码器

    例如,如果你有一个自定义的消息类`MyMessage`,你可以创建一个`MyMessageEncoder`,重写`encode()`方法,将`MyMessage`对象转换为`IoBuffer`。编码器的目的是确保数据在网络中传输时保持正确格式。 ```java public...

    Mina2.0框架源码剖析

    Mina使用IoBuffer作为数据缓冲区,它提供了一种高效的字节操作方式。同时,Mina还提供了Codec接口,用于数据的编码和解码。通过实现Codec接口,开发者可以自定义数据格式,实现与其他系统的通信。 五、异步I/O模型 ...

Global site tag (gtag.js) - Google Analytics