nio ByteBuffer理解

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();
			}
		}
		
	}

你可能感兴趣的:(ByteBuffer)