使用byteBuffer的 position和limit方法分段读取字节流

1.byteBuffer几个方法含义:  


      capacity:缓冲区的容量;


  limit:缓冲区还有多少数据能够取出或者缓冲区还有多少容量用于存放数据;


  position:相当于一个游标(cursor),记录我们从哪里开始写数据,从哪里开始读数据。

 

  三者关系:capacity代表了Buffer的容量是不变的,limit与position的差总是表示Buffer总可以读的数据,或者Buffer中可以写数据的容量。还有position总是小于等于limit,limit总是

 

小于等于capacity。


2.在能够读和写之前,必须有一个缓冲区,用静态方法 allocate() 来分配缓冲区


      ByteBuffer buf = ByteBuffer.allocate(1024);


3.flip()和clear()是Buffer的两个重要的方法,因为它们两个方法决定了缓冲是否能正常的进行读写工作


 当我们要想从缓冲区中写数据的时候必须先执行flip()方法,当我们要想从缓冲区中读数据时必须先执行clear()方法。


从Buffer中读取数据时,执行clear()方法,Buffer的内部结构变成了上图所示,position指向了可读数据的首位,limit指向了原来position的位置。


4.缓冲区分片(分段):slice() 方法根据现有的缓冲区创建一个 子缓冲区。也就是它创建一个新的缓冲区,新缓冲区与原来的缓冲区的一部分共享数据。

 

完整代码示例(本例中将缓冲区分为2段  :第一段  0----length    第二段 length-----contentLength ):

public void getMessageLength(SocketChannel sc,int length) {
		ByteBuffer buf = ByteBuffer.allocate(1024);
		try {
			
			sc.read(buf);
			buf.flip();
			 // 获得编码对象,即网络对等方的认识的字符串编码。
			Charset charset = Charset.forName("utf-8"); 
			// 生成解码器对象
			CharsetDecoder decoder = charset.newDecoder();
			//先取出buf中的前length个字节:buf.position(0); buf.limit(length);
			buf.position(0); 
			buf.limit(length); 
			//定义Buf 获取前length个字节的值
			ByteBuffer slice = buf.slice(); 
			 sc.read(slice);
			CharBuffer charBuffer = decoder.decode(slice);
			msgLength = charBuffer.toString();
			System.out.println(msgLength);
			//System.out.println(msgLength);
			
			int contentLength = Integer.parseInt(msgLength); //获取加密后的报文体长度
			//再取出buf中的length以后的所有字节字节:buf.position(length);buf.limit(contentLength);
			buf.position(length); 
			buf.limit(contentLength);
			//定义Buf 获取length以后所有字节
			ByteBuffer slice2 = buf.slice(); 
			 sc.read(slice2);
			 charBuffer = decoder.decode(slice2);
		    result = charBuffer.toString();
				System.out.println(result);
		} catch (IOException e) {
			result = "@@@@@ has left!";
		}
		
	}


5.合并byte[]方法 :

	/**
	 * 合并Byte[]数字函数
	 * @param  byte[] bytes1
	 * @param byte[] bytes2
	 * @return byte[]
	 */
	public   byte[]   combineTowTytes(byte[] bytes1,byte[] bytes2){    
		byte[] bytes3 = new byte[bytes1.length+bytes2.length];
		  System.arraycopy(bytes1,0,bytes3,0,bytes1.length);
		  System.arraycopy(bytes2,0,bytes3,bytes1.length,bytes2.length);
		  return bytes3 ;
	}


 

 

展开阅读全文

没有更多推荐了,返回首页