`

深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别

阅读更多

为了对后续关于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 的源码。

15
0
分享到:
评论
9 楼 linianf 2010-04-09  
ByteBuffer有一下三个重要的属性:

1)  容量(capacity) :表示该缓存区可以存放多少数据。

2)  极限(limit) :表示读写缓存的位置,不能对超过位置进行数据的读或写操作。

位置(position) :表示下一个缓存区的读写单元。每读写一次缓存区,位置都会变化。位置是一个非负整数。
8 楼 vozon 2010-01-25  
网上关于IoBuffer.putString()的介绍太少,感谢作者的分享太少了,来支持一下,希望能早些看到后续文章!
7 楼 armstrong311 2009-11-10  
写的很好!加油!
6 楼 ChinaEstone 2009-10-16  
hbzy0215 写道
一直在看,后续的文章加油啊!

呵呵,谢谢支持。
5 楼 hbzy0215 2009-10-16  
一直在看,后续的文章加油啊!
4 楼 ChinaEstone 2009-10-15  
doyourbest 写道
写的不错,一直在看,后续的文章加油啊!
同学们,不能光看,也得给作者加油啊


呵呵,谢谢了,最近时间比较紧张,这个周日的我会把Mina的后续文章整理出来。谢谢同志们的支持了。
3 楼 doyourbest 2009-10-15  
写的不错,一直在看,后续的文章加油啊!
同学们,不能光看,也得给作者加油啊
2 楼 shenmiao 2009-10-11  
老大,第7节什么时候出啊,你写的太好了。
1 楼 mx285545974 2009-09-15  
顶一个

相关推荐

    关于apache Mina Server

    深入理解Apache_Mina_(1)----_Mina的几个类 深入理解Apache_Mina_(2)----_与IoFilter相关的几个...深入理解Apache_Mina_(6)----_Java_Nio_ByteBuffer与Mina_ByteBuffer的区别(类图) 相信你们也愿意去下载更有价值的东西

    深入理解Apache_Mina

    在本文中提到的Java Nio ByteBuffer与Mina ByteBuffer的差异,实际上揭示了Apache Mina对于底层网络通信的封装程度。Apache Mina之所以能够成为一个广泛使用的框架,很大程度上是因为它解决了开发者在处理大量网络...

    深入理解Apache Mina

    2. **Java Nio ByteBuffer与Mina ByteBuffer的区别**: Java Nio的ByteBuffer是内存缓冲区,用于在通道(Channel)和处理器(Processor)之间传输数据。Mina也提供了自己的ByteBuffer实现,它扩展了Java Nio的...

    mina2资料-各种教程

    深入理解MINA的ByteBuffer和Java Nio ByteBuffer的区别,可以帮助开发者优化性能并减少内存拷贝。 线程模型是MINA的另一个关键配置项。MINA提供了多种线程模型,如简单的单线程模型、多线程模型以及Event-driven...

    Apache mina2学习笔记DEMO

    通过这个DEMO,你可以深入理解MINA如何实现高效的网络通信,并学习到如何利用MINA构建自定义协议的网络应用。无论你是初学者还是经验丰富的开发者,这个DEMO都将帮助你更好地掌握MINA框架,并将其应用于实际项目中。

    java mina框架全套

    Mina在Java NIO(非阻塞I/O)的基础上构建,支持多种传输层协议,如TCP、UDP、SSL/TLS等,并且能够处理大量的并发连接。 Mina的核心组件包括: 1. **Session**:Mina中的会话接口,代表了网络连接。每个网络连接都...

    nio.rar_NIO_java nio_java_nio_mina java n

    5. **Java NIO与Mina**:Mina是一个高性能、轻量级的网络应用框架,它利用了Java NIO的特性来构建网络服务。Mina提供了一套高级API,简化了基于NIO的网络编程,包括TCP和UDP协议的支持,以及过滤器链机制,方便实现...

    Java_nio&mina技术调研报告

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO(Blocking I/O)模型相比,NIO具有更高的并发性能和更有效的资源管理能力。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和...

    基于MINA构建高性能的NIO应用

    ### 基于MINA构建高性能的NIO应用 #### 概述 MINA作为一款优秀的客户端/服务器架构下的Java服务器框架,凭借其强大的功能和灵活性,在开发高性能网络应用程序方面表现突出。本文将深入探讨MINA的核心概念、优势...

    Java-NIO非阻塞服务器示例.docx

    Java-NIO非阻塞服务器示例 本资源主要讲解了Java-NIO非阻塞服务器的示例,通过使用Java-NIO包来实现非阻塞的服务器端模式。下面是从代码中提取的知识点: 一、Java-NIO包简介 Java-NIO(New I/O)包是Java 1.4...

    深入理解Mina

    4. **Buffer** 和 **ByteBuffer**: Java NIO中的ByteBuffer是用于存储二进制数据的,而Mina提供了一个自定义的Buffer类,它增强了NioByteBuffer的功能,比如添加了更多便捷的读写方法。Mina的Buffer类更适应于网络...

    apache网络框架mina简介

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用Java语言编写。MINA旨在简化网络编程,特别是TCP/IP和UDP/IP协议的应用开发,如HTTP、...

    NIO学习-Java源代码分享(含netty)

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种新的I/O方式,与传统的BIO(Blocking I/O)相比,NIO具有更好的性能和可伸缩性,尤其在处理大量并发连接时。NIO的核心组件包括Channel、Buffer和...

    MINA 2.0.9源码

    MINA 2.0.9是该框架的一个版本,其源码提供了深入理解MINA工作原理的机会,有助于开发者进行定制化开发或优化。 MINA的核心特性在于它的异步IO模型,它采用了NIO(Non-blocking I/O)技术,使得应用程序在处理大量...

    2021最新-Java NIO视频教程.txt打包整理.zip

    在实际开发中,Java NIO通常与Apache等开源库结合使用,例如Apache Mina或Netty,它们提供了基于NIO的高性能网络通信框架,简化了网络编程的复杂性。 在"2021最新-Java NIO视频教程.txt打包整理.zip"这个资源中,你...

    Mina2.0自学手册

    6. Java NIO还引入了新的IO API和类库,例如ByteBuffer、FileChannel、Selector等。 Java NIO与传统IO的主要区别在于其非阻塞特性。在传统IO中,一个操作(如读写数据)会阻塞调用线程,直到操作完成或者发生错误。...

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

    - **UserGuide**: 用户指南,涵盖了 Mina 的基本概念和多个实用示例,是深入理解 Mina 功能的关键文档。 #### 二、Mina 核心概念与组件 1. **IoBuffer** - IoBuffer 是 Mina 中用于数据存储和传输的核心类,它是...

    Mina源码解析

    Apache Mina是一个开源的网络通信框架,主要用于构建高性能、高可用性的网络应用程序。它提供了高度模块化的设计,允许开发者以简单的方式处理各种网络协议,如TCP/IP、UDP/IP以及SSL/TLS等。在深入解析Mina源码的...

Global site tag (gtag.js) - Google Analytics