Mina IOBuffer

简介

IoBuffer是MINA应用程序中使用的一种字节缓冲区,它是JDK中ByteBuffer类的替代品。MINA框架出于下面两个原因没有直接使用JDK中nio包内的ByteBuffe:

  • 没有提供可用的getters和putters方法,例如fill, get/putString, 和get/putAsciiInt();
  • 由于它的容量是固定的,所以不利于存储变长数据。

MINA 3 将改变这种情况。MINA框架对nio ByteBuffer做了一层封装的最主要原因是希望能够拥有一种可扩展的缓冲区。这并不是一个很好的决定。缓冲区就是缓冲区:一个用于存储临时数据的临时空间,直到这些数据被使用。其实还有些其他的解决方案,例如可以对一组nio ByteBuffer进行包装来避免数据从一个缓冲区向两个容量更大的缓冲区复制,从而得到一个容量可扩展的缓冲区。

或许在filter之间传递数据时使用InputStrea来代替字节缓冲区会更加舒适,因为这不需要提供一种可以存储数据的特性,这种数据结构可以使字节数组、字符串或者其他类型的消息等等。

最后,但并非最不重要的一点是,当前的实现并没有达成一个目标:零拷贝策略(例如当我们从socket中读取了一些数据,我们希望避免持续的数据拷贝)。如果我们使用了可以扩展的字节缓冲区,那么我们只需要在管理大数据消息时进行数据拷贝。请记住MINA ByteBuffer只不过是NIO ByteBuffer的顶层封装,当我们使用direct buffers时,很可能是一个很严重的问题。

 

IoBuffer 操作

分配一个新的Buffer

IoBuffer 是一个抽象类,所以它不能直接被实例化。分配IoBuffer,我们可以使用两种allocate()方法。

// Allocates a new buffer with a specific size, defining its type (direct or heap)
public static IoBuffer allocate(int capacity, boolean direct)

// Allocates a new buffer with a specific size
public static IoBuffer allocate(int capacity)

allocate()方法是用一个或两个参数。第一种形式使用两个参数:

  • capacity - buffer的容量
  • direct -buffer的类型。true 意味着得到一个direct buffer,false 意味着得到一个heap buffer

 

默认的buffer分配是由SimpleBufferAllocator 处理的。

可选的, 下面的形式也可以使用:

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

buffer.putString("12345678", encoder);
       
// Add more to this buffer
buffer.put((byte)10);

 按照上面的例子,如果数据的长度大于8byte的话,IoBuffe会根据情况重新分配其内置的ByteBuffer,它的容量会被加倍,它的limit会增长到String被写入时的最后position。这种行为与StringBuffer工作的方式十分类似。

注意:这种程序结构在MINA3.0时会被废弃,因为这并不是增长buffer容量的最好方式。这种方式很可能被一种类似InputStream的方式所替代,在InputStream的背后很可能是一组固定长度的ByteBuffers。

 

创建自动收缩的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的buffer,并将自动收缩设置为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,因为我们使用16指定了该buffer的容量,16也就成了该buffer的最小容量
  • 调用shrink()方法后,容量仍旧为16,所以无论怎么调用紧缩方法,容量都不好小于其初始容量
  • 增加该buffer的容量至32,该buffer的容量达到32
  • 调用 shrink()方法,容量回收至16,从而剔除了冗余的容量

再次强调,这种方式是一种默认的行为,我们不需要明确指明一个buffer是否能被收缩。

 

Buffer分配

IoBufferAllocater负责分配并管理buffer,如果你希望使用你的方式精确控制分配行为,请自己实现IoBufferAllocater 接口。

MINA提供了IoBufferAllocater的两种实现,如下:

  • SimpleBufferAllocator (默认) - 每次创建一个新的buffer
  • CachedBufferAllocator - 缓存buffer,使buffer在扩展时可以被重用

注意:在新版本的JVM中,使用cached IoBuffer并不能明显提高性能。

你可以自己实现IoBufferAllocator接口并在IoBuffer上调用setAllocator()方法来指定使用你的实现。


常用方法


如果要了解Mina的IoBuffer(现在不叫ByteBuffer了),直接看java.nio.ByteBuffer就行了,常用的方法有:allocate、put、get、clear、flip、limit、position、mark、reset
  1. capacity是值buffer最多能放多少字节(但不一定允许放这么多,因为有limit),假设为10,则最多放10个字节。
  2. limit是用来限制最多可以读或写0和limit之间的字节,limit<=capacity。
  3. position是指你当前读或者写到了那个位置,当调用put和get时,position会随之变化,比如调用了get(),读取了一个字节,则position就指向下一个字节了;调用put写入之后,也是一样。
  4. mark是用来暂时标记当前位置,以便后面需要的时候调用reset()使position返回该位置。
  5. put()可以写入单字节,或者字节数组,主要的写方法(当然还有其他写方法),导致position变化
  6. get()可以读出单字节,或者字节数组,主要的读方法(当然还有其他读方法),导致position变化
  7. flip()方法,将limit设置为position,position设置为0,为读取开头到当前position的内容做准备。(丢弃mark)
  8. clear()方法,将limit设置为capacity, position设置为0,为从头开始写入做准备。(丢弃mark)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值