为了对后续关于Mina 的 ProtocolFilter(
编解码器 ) 的编写有一个更好的理解,本文讲述一下关于 MinaByteBuffer
和 JavaNioByteBuffer 的区别。关于 JavaNioByteBuffer
和 MinaByteBuffer 及其子类的类图在附件中都已经给出了。因为
Mina 的 ByteBuffer 在 Mina2.0
以上的版本中都改称 IoBuffer 。为了使后文关于 ByteBuffer
的名字不致混淆, MinaByteBuffer 都统称 IoBuffer
, JavaNioByteBuffer 统称 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 。
-
-
ByteBufferbuffer=ByteBuffer.allocate(1024);
-
-
StringuserName="chinaestone";
-
char[]charArray=userName.toCharArray();
-
-
System.out.println("这是往缓存中存放的字符串");
-
for(inti=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());
- }
-
-
-
ByteBufferbuffer=ByteBuffer.allocate(1024);
-
-
StringuserName="chinaestone";
-
char[]charArray=userName.toCharArray();
-
System.out.println("这是往缓存中存放的字符串");
-
for(inti=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());
- }
// 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'sdrinkcode,来看看 Mina 的
IoBuffer 是如何读写字符串的。
-
ByteBufferbuffer=ByteBuffer.allocate(1024);
-
-
Charsetch=Charset.forName("utf-8");
-
- CharsetEncoderencoder=ch.newEncoder();
-
- CharsetDecoderdecoder=ch.newDecoder();
-
- System.out.println(buffer.remaining());
-
-
Stringcs="中國壹石頭";
-
- buffer.putString(cs,encoder);
- System.out.println(buffer.remaining());
-
- buffer.limit(buffer.position());
-
-
buffer.position(0);
-
-
- Stringstr=buffer.getString(decoder);
-
- System.out.println(str);
- System.out.println(buffer.remaining());
-
ByteBufferbuffer=ByteBuffer.allocate(1024);
-
-
Charsetch=Charset.forName("utf-8");
-
- CharsetEncoderencoder=ch.newEncoder();
-
- CharsetDecoderdecoder=ch.newDecoder();
- System.out.println(buffer.remaining());
-
-
Stringcs="中國壹石頭";
-
- buffer.putString(cs,encoder);
- System.out.println(buffer.remaining());
-
- buffer.limit(buffer.position());
-
-
buffer.position(0);
-
- Stringstr=buffer.getString(decoder);
-
- System.out.println(str);
- System.out.println(buffer.remaining());
// 获取一个容量为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是一个高性能的网络应用框架,主要用于简化网络...通过阅读《深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别》的相关资料,可以更深入地理解这两个类的具体实现和应用场景。
深入理解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的...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(BIO)相比,NIO具有更高的性能和更好的灵活性。NIO在Java 1.4版本中引入,其核心是Channel、Buffer和Selector三大组件。下面...
深入理解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中的会话接口,代表了网络连接。每个网络连接都...
Java-NIO非阻塞服务器示例 本资源主要讲解了Java-NIO非阻塞服务器的示例,通过使用Java-NIO包来实现非阻塞的服务器端模式。下面是从代码中提取的知识点: 一、Java-NIO包简介 Java-NIO(New I/O)包是Java 1.4...
在实际开发中,Java NIO通常与Apache等开源库结合使用,例如Apache Mina或Netty,它们提供了基于NIO的高性能网络通信框架,简化了网络编程的复杂性。 在"2021最新-Java NIO视频教程.txt打包整理.zip"这个资源中,你...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO(Blocking I/O)模型相比,NIO具有更高的并发性能和更有效的资源管理能力。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和...
### 基于MINA构建高性能的NIO应用 #### 概述 MINA作为一款优秀的客户端/服务器架构下的Java服务器框架,凭借其强大的功能和灵活性,在开发高性能网络应用程序方面表现突出。本文将深入探讨MINA的核心概念、优势...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用Java语言编写。MINA旨在简化网络编程,特别是TCP/IP和UDP/IP协议的应用开发,如HTTP、...
4. **Buffer** 和 **ByteBuffer**: Java NIO中的ByteBuffer是用于存储二进制数据的,而Mina提供了一个自定义的Buffer类,它增强了NioByteBuffer的功能,比如添加了更多便捷的读写方法。Mina的Buffer类更适应于网络...
MINA 2.0.9是该框架的一个版本,其源码提供了深入理解MINA工作原理的机会,有助于开发者进行定制化开发或优化。 MINA的核心特性在于它的异步IO模型,它采用了NIO(Non-blocking I/O)技术,使得应用程序在处理大量...
**NIO(New IO)**是中国Java开发人员在构建高性能网络应用程序时经常使用的API。它在Java 1.4版本中被引入,为Java开发者提供了一种替代传统的BIO(Blocking I/O)模型的新方法。NIO的核心在于非阻塞I/O模型,这...
6. Java NIO还引入了新的IO API和类库,例如ByteBuffer、FileChannel、Selector等。 Java NIO与传统IO的主要区别在于其非阻塞特性。在传统IO中,一个操作(如读写数据)会阻塞调用线程,直到操作完成或者发生错误。...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,用于构建高性能、高可用性的网络应用程序,特别是针对网络协议服务器。MINA 提供了一个统一的API,无论底层是TCP/IP还是UDP/...
这个简单的NIO服务器示例展示了如何使用Java NIO进行非阻塞I/O通信,但实际的生产环境中,通常会使用更高级的框架,如Apache Mina或Netty,它们提供了更丰富的功能和更高的性能优化。Apache Mina是一个轻量级、高...