`
xly_971223
  • 浏览: 1277529 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nio ByteBuffer理解

    博客分类:
  • java
 
阅读更多
ByteBuffer实际上是一块连续的内容 可以理解成一个byte数组

byte数组主要有三个属性
position:读/写的开始位置
limit:读/写的结束位置
capacity:数组大小

byte数组主要2中操作
读:读position和limit之间的数据,
    这儿要注意,不是读取0到capacity之间数据
    读前一般会执行
buffer.flip()
方法,把position和limit移动到要读取的数据两端

写:向byte数组的position位置写数据,同时position值增加
    当position大于limit时,写入会失败,
    所以在写之前经常执行
buffer.limit(buffer.capacity);


参考代码
	//收数据
	private void receive(SelectionKey key) throws IOException{
		SocketChannel socketChannel = (SocketChannel)key.channel();
		ByteBuffer attachBuffer = (ByteBuffer)key.attachment();
		
		globalBuffer.clear();
		logger.debug("globalBuffer clear:{}", globalBuffer.toString());
		int count = socketChannel.read(globalBuffer);
		logger.debug("socketChannel.read(globalBuffer):{}", globalBuffer.toString());
		
		if(count > 0){
			globalBuffer.flip();
			logger.debug("globalBuffer.flip():{}", globalBuffer.toString());
			
			logger.debug("attachBuffer:{}", attachBuffer.toString());
			
			attachBuffer.limit(attachBuffer.capacity()); //写前移动endPointer
			logger.debug("attachBuffer.limit(attachBuffer.capacity()):{}", attachBuffer.toString());
			
			attachBuffer.put(globalBuffer);//写数据,position值会增加
			logger.debug("attachBuffer.put(globalBuffer):{}", attachBuffer.toString());
			
			attachBuffer.flip(); //读前需执行flip
			String readData = decoder.decode(attachBuffer).toString();
			logger.debug("readData:{}", readData);
			
			YhbyCommand cmd = null;
			if(readData.length() == YhbyStatus.BODY_LENGTH && readData.startsWith(YhbyStatus.STATUS_CODE)){
				cmd = new YhbyStatus(readData);
				dispatcher.dispatch(cmd);
				key.cancel();
				socketChannel.close();
			}
			
			if(readData.length() == YhbyAway.BODY_LENGTH && readData.startsWith(YhbyAway.AWAY_CODE)){
				cmd = new YhbyAway(readData);
				dispatcher.dispatch(cmd);
				key.cancel();
				socketChannel.close();
			}
		}
		
	}
3
0
分享到:
评论

相关推荐

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

    Apache Mina是一个高性能的网络应用框架,主要用于简化网络...通过阅读《深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别》的相关资料,可以更深入地理解这两个类的具体实现和应用场景。

    Java NIO学习笔记——ByteBuffer用法

    同时,理解源码可以帮助深入理解Java NIO的工作原理,提升对非阻塞I/O的理解。 总的来说,掌握Java NIO中的ByteBuffer用法对于编写高性能的I/O密集型应用至关重要。通过熟练运用ByteBuffer,开发者可以设计出更高效...

    深入理解Apache_Mina

    总的来说,深入理解Apache Mina框架是一项系统性的工程,涉及到网络编程的方方面面,包括对Java NIO的深入理解、对框架核心组件的认识,以及对高性能网络通信实现原理的把握。对于想要开发稳定、高效的网络应用的IT...

    Android开发进阶之NIO非阻塞包[定义].pdf

    在Android开发中,提高网络通信性能是至关重要的,尤其是在处理多点连接时。NIO(New I/O)技术,从JDK 1.4版本开始引入,为Android开发者...对于Android开发者来说,理解和掌握NIO技术对于优化网络相关功能至关重要。

    NIO复制文件

    本节我们将深入探讨如何利用NIO进行文件复制,并通过示例代码`NioDemo.java`来理解相关类的使用。 首先,NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。在文件复制过程中,我们主要...

    java NIO 写文件

    首先,理解Java NIO的基本概念非常重要。NIO中的“N”代表“非阻塞”,这意味着在进行I/O操作时,程序可以继续执行其他任务,而不是等待数据传输完成。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...

    基于nio实现的多文件上传源码

    首先,理解NIO的基本概念是必要的。NIO中的“非阻塞”意味着当数据不可用时,读写操作不会被挂起,而是立即返回,这极大地提高了程序的效率。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器...

    NIO项目源码.zip

    通过分析这个NIO项目源码,你可以学习到如何在实际项目中应用NIO技术,理解其设计模式和优化策略,对于提升Java网络编程的能力大有裨益。深入研究NIO的细节,有助于你在开发高效、高并发的服务时做出明智的选择。

    nio演示代码

    标题"nio演示代码"表明我们将探讨NIO的实际应用,通过代码示例来理解其工作原理和优势。在CSDN博客中,作者wgyscsf分享了一篇文章,详细介绍了NIO的用法。 在NIO模型中,以下几个核心组件是关键: 1. **通道...

    javaNiO.doc

    为了更直观地理解NIO的优势,下面通过一个具体的例子来比较使用传统I/O和NIO读取文件的差异。 ```java // 使用传统I/O读取文件 public void ioRead(String file) throws IOException { FileInputStream in = new ...

    基于nio的简易聊天室

    在Java编程领域,NIO(New Input/Output)是一个重要的概念,它提供了非阻塞I/O操作的能力,相比传统的BIO(Blocking I/O),在处理大量并发连接...通过这个项目,开发者可以深入理解NIO在实际应用中的工作原理和优势。

    NIO入门pdf分享

    《NIO入门》一书是理解Java NIO(New Input/Output)的重要参考资料,NIO在Java编程中扮演着至关重要的角色,特别是在处理高并发、大数据传输等场景下。本PDF文档将引领读者深入理解这一核心概念。 NIO,全称New ...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,与传统的IO模型(基于流的I/O和基于缓冲区...理解并掌握Java NIO的这些概念和用法对于提升Java网络编程能力至关重要。

    自己写的Java NIO 同步不阻塞IO操作

    文件"NIOSocket"可能是这个NIO Socket通信示例的源代码,可能包含了上述提到的ServerSocketChannel、SocketChannel、Selector和ByteBuffer的使用示例,通过阅读和分析这个文件,你可以更深入地理解Java NIO在实际...

    基于java的BIO、NIO、AIO通讯模型代码实现

    关键类包括:`java.nio.channels.Selector`、`java.nio.channels.ServerSocketChannel`、`java.nio.channels.SocketChannel`,以及缓冲区类如`ByteBuffer`。 **3. 埼于Java的AIO(Asynchronous I/O)** AIO,也...

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO...对于初学者来说,这些源码实例可以帮助理解Java NIO的基本用法和优势,进一步提升在实际项目中的应用能力。

    nio.zip_NIO_NewIO_NIO.c_java NIO chm_java nio

    NIO(New IO)是Java平台中用于处理输入/输出...`nio.zip`这个压缩包包含了有关NIO的CHM文档,对于深入理解和运用Java NIO技术,这是一个非常有价值的资源。建议读者下载并仔细研究,以便更好地利用NIO提升程序性能。

    java nio 写文件

    要使用NIO写入文件,你需要先创建一个ByteBuffer,然后将数据放入缓冲区,最后调用`FileChannel`的`write()`方法将缓冲区中的数据写入文件。这个过程可以反复进行,直到所有数据都写入文件。以下是一个简单的示例:...

    基于Groovy的NIO框架,仅供学习Java NIO使用。.zip

    Java NIO提供了ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer和LongBuffer等类型。 3. **选择器(Selectors)**:选择器用于监视多个通道的状态,当通道准备就绪进行读写操作时,选择器会通知我们...

Global site tag (gtag.js) - Google Analytics