原文: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
分享到:
相关推荐
org.apache.mina.core.buffer.IoBuffer mina core 包
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学习的最佳代码
NULL 博文链接:https://410063005.iteye.com/blog/1724491
最近使用Mina开发一个Java的NIO服务端程序,...IoBuffer常用方法: 19 Demo1:模拟根据文本换行符编解码 20 Demo2:改进Demo1的代码 22 Demo3:自定义协议编解码 31 3.IoHandler接口 50 三. Mina实例 50 四. 其他 50
mina连接,mina心跳连接,mina断线重连。其中客户端可直接用在android上。根据各方参考资料,经过自己的理解弄出来的。CSDN的资源分太难得了。
mina-core-2.0.0-M6.jar mina-example-2.0.0-M6.jar mina-filter-codec-netty-2.0.0-M6.jar mina-filter-compression-2.0.0-M6.jar mina-integration-beans-2.0.0-M6.jar mina-integration-jmx-2.0.0-M6.jar mina-...
mina学习资料 引言 1 一. Mina入门 2 ...IoBuffer常用方法: 19 Demo1:模拟根据文本换行符编解码 20 Demo2:改进Demo1的代码 22 Demo3:自定义协议编解码 31 3.IoHandler接口 50 三. Mina实例 50 四. 其他 50
Mina开发之客户端的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html
mina的使用初步入门mina的使用初步入门mina的使用初步入门
Mina开发之服务器的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html Mina开发之客户端的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html
里面包含mina2.0的api(英文)和mina自学手册,还有mina的开发指导
Apache Mina Server 2.0 中文参考手册 Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP ...步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。
Apache MINA是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。 当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版...
mina的高级使用,mina文件图片传送,
Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)
深入理解Apache_Mina_(1)----_Mina的几个类 深入理解Apache_Mina_(2)----_与IoFilter相关的几个类 深入理解Apache_Mina_(3)----_与IoHandler相关的几个类 深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和...
NULL 博文链接:https://mina-java.iteye.com/blog/1115429