为了对后续关于Mina
的
ProtocolFilter(
编解码器
)
的编写有一个更好的理解,本文讲述一下关于
Mina ByteBuffer
和
Java Nio ByteBuffer
的区别。关于
Java Nio ByteBuffer
和
Mina ByteBuffer
及其子类的类图在附件中都已经给出了。因为
Mina
的
ByteBuffer
在
Mina 2.0
以上的版本中都改称
IoBuffer
。为了使后文关于
ByteBuffer
的名字不致混淆,
Mina ByteBuffer
都统称
IoBuffer
,
Java Nio ByteBuffer
统称
ByteBuffer
。关于
IoBuffer
中的对
ByteBuffer
扩展及一些重要的方法都在
IoBuffer
的类图中用红色方框标出。详细的信息请参考附件中。
在开始对IoBuffer
的讨论前,先简单的讲述一下
ByteBuffer
的用法。
IoBuffer
是对
ByteBuffer
的一个封装。
IoBuffer
中的很多方法都是对
ByteBuffer
的直接继承。只是对
ByteBuffer
添加了一些扩展了更加实用的方法。
(1)
ByteBuffer简介
ByteBuffer继承于
Buffer
类,
ByteBuffer
中存放的是字节,如果要将它们转换成字符串则需要使用
Charset
,
Charset
是字符编码。它提供了把字节流转换成字符串
(
解码
)
和将字符串转换成字节流
(
编码
)
的方法。这个和后面讲述的
Mina
的编解码的工作原理类似。对
ByteBuffer
的访问可以使用
read()
,
write()
等方法。
ByteBuffer有一下三个重要的属性:
1)
容量(capacity)
:表示该缓存区可以存放多少数据。
2)
极限(limit)
:表示读写缓存的位置,不能对超过位置进行数据的读或写操作。
位置(position)
:表示下一个缓存区的读写单元。每读写一次缓存区,位置都会变化。位置是一个非负整数。
ByteBuffer的这三个属性相当于三个标记位,来表示程序可以读写的区域:
上图简单的表示了容量、极限、位置在缓存区中的位置。其中极限只能标记容量以内的位置,即极限值的大小不能超过容量。同样位置是用来标记程序对缓存区进行读或写操作的开始位置。程序只能在极限以内的范围进行读写,即读写操作不能超过极限的范围,所以位置值的大小也不能超过极限。三者的大小关系为:容量>
极限
>
位置
>=0
。
上面说到ByteBuffer
的三个属性只是缓存区的标记位置。那么如何改变这些标记的位置呢?
ByteBuffer
提供了一下三种方法来改变上面的属性值。
1)
clear():极限设置为容量,位置设为
0
。
2)
flip():极限设为位置,位置设为
0
。
3)rewind():不改变极限,位置设为
0
。
// JDK没有提供ByteBuffer的公开构造方法只能通过该
// 方法来创建一个缓存区。
ByteBuffer buffer = ByteBuffer.allocate(1024);
// ========测试缓存读写一个字符串=======//
String userName ="chinaestone";
char[] charArray = userName.toCharArray();
System.out.println("这是往缓存中存放的 字符串");
for(int i=0;i<charArray.length;i++){
System.out.println(charArray[i]);
buffer.putChar(charArray[i]);
}
buffer.limit(buffer.position());
buffer.position(0);
System.out.println();
System.out.println("这是缓存中取出来的 字符串");
while(buffer.hasRemaining()){
System.out.println(buffer.getChar());
}
上面只是一个简单的演示程序,功能是实现对字符串的读写,比较“
笨
”
,呵呵。关于如何向
ByteBuffer
读写字符串会在
IoBuffer
中详细讲解。
(2)
IoBuffer简介
IoBuffer是对
ByteBuffer
的扩展,并不是和
ByteBuffer
毫无关系的。对
Mina
或者
Socket
应用来说,
ByteBuffer
提供的方法存在一下不足:
1)
它没有提供足够可用的put
和
set
方法,例如:
fill
、
get/putString
、
get/putAsciiInt()
等。
2)很难将可变长度的数据放入
ByteBuffer
。
基于以上的缺点,Mina
提供了
IoBuffer
来补充了
ByteBuffer
的不足之处。
Let's drink code,来看看
Mina
的
IoBuffer
是如何读写字符串的。
// 获取一个容量为1024字节的ByteBuffer
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 设置系统字符集为utf-8
Charset ch =Charset.forName("utf-8");
// 获取utf-8的编码器
CharsetEncoder encoder = ch.newEncoder();
// 获取utf-8的解码器
CharsetDecoder decoder = ch.newDecoder();
System.out.println(buffer.remaining());
// 进行编码的字符串
String cs = "中國壹石頭";
// 将字符串编码后放入缓存
buffer.putString(cs,encoder);
System.out.println(buffer.remaining());
// 将缓存的位置设为位置
buffer.limit(buffer.position());
// 将缓存的位置设为0
buffer.position(0);
// 读取缓存中的字符串
String str = buffer.getString(decoder);
// 打印输出缓存中的信息
System.out.println(str);
System.out.println(buffer.remaining());
注意此处用到了
Charset
,它的作用在上面已经说道,它主要用来进行编解码的,因此对字符串进行编码和解码时注意要使用相同的编码。
(3)
IoBuffer的子类
为了更好的使用IoBuffer
进行开发,
IoBuffer
提供了两个子类
BaseByteBuffer
和
ByteBufferProxy
。
BaseByteBuffer
实现了
IoBuffer
中定义的绝大多数方法。如果你在实际开发中要扩展适合于自己的方法时可以继承该类,因为它可以使你的实现更加简单。
ByteBufferProxy
中封装了一个
IoBuffer
,所有对
ByteBuffer
的操作都可以通过该类提供的方法来实现。
本文只是简单的介绍了IoBuffer
和
ByteBuffer
的基本知识,如果需要了解
IoBuffer
更多的信息请参考
Mina
的帮助文档和
Mina
的源码。
分享到:
相关推荐
深入理解Apache_Mina_(1)----_Mina的几个类 深入理解Apache_Mina_(2)----_与IoFilter相关的几个...深入理解Apache_Mina_(6)----_Java_Nio_ByteBuffer与Mina_ByteBuffer的区别(类图) 相信你们也愿意去下载更有价值的东西
在本文中提到的Java Nio ByteBuffer与Mina ByteBuffer的差异,实际上揭示了Apache Mina对于底层网络通信的封装程度。Apache Mina之所以能够成为一个广泛使用的框架,很大程度上是因为它解决了开发者在处理大量网络...
2. **Java Nio ByteBuffer与Mina ByteBuffer的区别**: Java Nio的ByteBuffer是内存缓冲区,用于在通道(Channel)和处理器(Processor)之间传输数据。Mina也提供了自己的ByteBuffer实现,它扩展了Java Nio的...
深入理解MINA的ByteBuffer和Java Nio ByteBuffer的区别,可以帮助开发者优化性能并减少内存拷贝。 线程模型是MINA的另一个关键配置项。MINA提供了多种线程模型,如简单的单线程模型、多线程模型以及Event-driven...
通过这个DEMO,你可以深入理解MINA如何实现高效的网络通信,并学习到如何利用MINA构建自定义协议的网络应用。无论你是初学者还是经验丰富的开发者,这个DEMO都将帮助你更好地掌握MINA框架,并将其应用于实际项目中。
Mina在Java NIO(非阻塞I/O)的基础上构建,支持多种传输层协议,如TCP、UDP、SSL/TLS等,并且能够处理大量的并发连接。 Mina的核心组件包括: 1. **Session**:Mina中的会话接口,代表了网络连接。每个网络连接都...
5. **Java NIO与Mina**:Mina是一个高性能、轻量级的网络应用框架,它利用了Java NIO的特性来构建网络服务。Mina提供了一套高级API,简化了基于NIO的网络编程,包括TCP和UDP协议的支持,以及过滤器链机制,方便实现...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO(Blocking I/O)模型相比,NIO具有更高的并发性能和更有效的资源管理能力。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和...
### 基于MINA构建高性能的NIO应用 #### 概述 MINA作为一款优秀的客户端/服务器架构下的Java服务器框架,凭借其强大的功能和灵活性,在开发高性能网络应用程序方面表现突出。本文将深入探讨MINA的核心概念、优势...
Java-NIO非阻塞服务器示例 本资源主要讲解了Java-NIO非阻塞服务器的示例,通过使用Java-NIO包来实现非阻塞的服务器端模式。下面是从代码中提取的知识点: 一、Java-NIO包简介 Java-NIO(New I/O)包是Java 1.4...
4. **Buffer** 和 **ByteBuffer**: Java NIO中的ByteBuffer是用于存储二进制数据的,而Mina提供了一个自定义的Buffer类,它增强了NioByteBuffer的功能,比如添加了更多便捷的读写方法。Mina的Buffer类更适应于网络...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用Java语言编写。MINA旨在简化网络编程,特别是TCP/IP和UDP/IP协议的应用开发,如HTTP、...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种新的I/O方式,与传统的BIO(Blocking I/O)相比,NIO具有更好的性能和可伸缩性,尤其在处理大量并发连接时。NIO的核心组件包括Channel、Buffer和...
MINA 2.0.9是该框架的一个版本,其源码提供了深入理解MINA工作原理的机会,有助于开发者进行定制化开发或优化。 MINA的核心特性在于它的异步IO模型,它采用了NIO(Non-blocking I/O)技术,使得应用程序在处理大量...
在实际开发中,Java NIO通常与Apache等开源库结合使用,例如Apache Mina或Netty,它们提供了基于NIO的高性能网络通信框架,简化了网络编程的复杂性。 在"2021最新-Java NIO视频教程.txt打包整理.zip"这个资源中,你...
6. Java NIO还引入了新的IO API和类库,例如ByteBuffer、FileChannel、Selector等。 Java NIO与传统IO的主要区别在于其非阻塞特性。在传统IO中,一个操作(如读写数据)会阻塞调用线程,直到操作完成或者发生错误。...
- **UserGuide**: 用户指南,涵盖了 Mina 的基本概念和多个实用示例,是深入理解 Mina 功能的关键文档。 #### 二、Mina 核心概念与组件 1. **IoBuffer** - IoBuffer 是 Mina 中用于数据存储和传输的核心类,它是...
Apache Mina是一个开源的网络通信框架,主要用于构建高性能、高可用性的网络应用程序。它提供了高度模块化的设计,允许开发者以简单的方式处理各种网络协议,如TCP/IP、UDP/IP以及SSL/TLS等。在深入解析Mina源码的...