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();
}
}
}
分享到:
相关推荐
Apache Mina是一个高性能的网络应用框架,主要用于简化网络...通过阅读《深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别》的相关资料,可以更深入地理解这两个类的具体实现和应用场景。
同时,理解源码可以帮助深入理解Java NIO的工作原理,提升对非阻塞I/O的理解。 总的来说,掌握Java NIO中的ByteBuffer用法对于编写高性能的I/O密集型应用至关重要。通过熟练运用ByteBuffer,开发者可以设计出更高效...
总的来说,深入理解Apache Mina框架是一项系统性的工程,涉及到网络编程的方方面面,包括对Java NIO的深入理解、对框架核心组件的认识,以及对高性能网络通信实现原理的把握。对于想要开发稳定、高效的网络应用的IT...
在Android开发中,提高网络通信性能是至关重要的,尤其是在处理多点连接时。NIO(New I/O)技术,从JDK 1.4版本开始引入,为Android开发者...对于Android开发者来说,理解和掌握NIO技术对于优化网络相关功能至关重要。
本节我们将深入探讨如何利用NIO进行文件复制,并通过示例代码`NioDemo.java`来理解相关类的使用。 首先,NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。在文件复制过程中,我们主要...
首先,理解Java NIO的基本概念非常重要。NIO中的“N”代表“非阻塞”,这意味着在进行I/O操作时,程序可以继续执行其他任务,而不是等待数据传输完成。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...
首先,理解NIO的基本概念是必要的。NIO中的“非阻塞”意味着当数据不可用时,读写操作不会被挂起,而是立即返回,这极大地提高了程序的效率。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器...
通过分析这个NIO项目源码,你可以学习到如何在实际项目中应用NIO技术,理解其设计模式和优化策略,对于提升Java网络编程的能力大有裨益。深入研究NIO的细节,有助于你在开发高效、高并发的服务时做出明智的选择。
标题"nio演示代码"表明我们将探讨NIO的实际应用,通过代码示例来理解其工作原理和优势。在CSDN博客中,作者wgyscsf分享了一篇文章,详细介绍了NIO的用法。 在NIO模型中,以下几个核心组件是关键: 1. **通道...
为了更直观地理解NIO的优势,下面通过一个具体的例子来比较使用传统I/O和NIO读取文件的差异。 ```java // 使用传统I/O读取文件 public void ioRead(String file) throws IOException { FileInputStream in = new ...
在Java编程领域,NIO(New Input/Output)是一个重要的概念,它提供了非阻塞I/O操作的能力,相比传统的BIO(Blocking I/O),在处理大量并发连接...通过这个项目,开发者可以深入理解NIO在实际应用中的工作原理和优势。
《NIO入门》一书是理解Java NIO(New Input/Output)的重要参考资料,NIO在Java编程中扮演着至关重要的角色,特别是在处理高并发、大数据传输等场景下。本PDF文档将引领读者深入理解这一核心概念。 NIO,全称New ...
Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,与传统的IO模型(基于流的I/O和基于缓冲区...理解并掌握Java NIO的这些概念和用法对于提升Java网络编程能力至关重要。
文件"NIOSocket"可能是这个NIO Socket通信示例的源代码,可能包含了上述提到的ServerSocketChannel、SocketChannel、Selector和ByteBuffer的使用示例,通过阅读和分析这个文件,你可以更深入地理解Java NIO在实际...
关键类包括:`java.nio.channels.Selector`、`java.nio.channels.ServerSocketChannel`、`java.nio.channels.SocketChannel`,以及缓冲区类如`ByteBuffer`。 **3. 埼于Java的AIO(Asynchronous I/O)** AIO,也...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO...对于初学者来说,这些源码实例可以帮助理解Java NIO的基本用法和优势,进一步提升在实际项目中的应用能力。
NIO(New IO)是Java平台中用于处理输入/输出...`nio.zip`这个压缩包包含了有关NIO的CHM文档,对于深入理解和运用Java NIO技术,这是一个非常有价值的资源。建议读者下载并仔细研究,以便更好地利用NIO提升程序性能。
要使用NIO写入文件,你需要先创建一个ByteBuffer,然后将数据放入缓冲区,最后调用`FileChannel`的`write()`方法将缓冲区中的数据写入文件。这个过程可以反复进行,直到所有数据都写入文件。以下是一个简单的示例:...
Java NIO提供了ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer和LongBuffer等类型。 3. **选择器(Selectors)**:选择器用于监视多个通道的状态,当通道准备就绪进行读写操作时,选择器会通知我们...