使用byteBuffer的 position和limit方法分段读取字节流
2012-11-21 14:53
1456 查看
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 ):
5.合并byte[]方法 :
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 ; }
相关文章推荐
- JAVA NIO 之ByteBuffer的mark、position、limit、flip、reset,get方法介绍
- Android在JNI中使用ByteBuffer的方法
- NIO ByteBuffer 使用方法
- NIO ByteBuffer 使用方法
- 使用MappedByteBuffer(映射文件)对excel表格进行随机定位和读取
- 使用NIO的FileChannel和ByteBuffer高效读取文件
- ByteBuffer的position、limit和capacity
- 使用MappedByteBuffer读取大文件(1G以上)和释放MappedByteBuffer的资源
- day19字符流的缓冲区。自己MyBufferReader的readLine方法。装饰设计模式。字节流。自定义一个缓冲区模拟BufferedInputStream。读取键盘
- java.nio.ByteBuffer的flip、rewind和compact几个方法的区分使用 (转载)
- Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件的方法
- java.nio.ByteBuffer的flip、rewind和compact几个方法的区分使用
- java.nio.ByteBuffer的flip、rewind和compact几个方法的区分使用
- Java使用ByteBuffer读取大文件
- 使用ByteBuffer一个一个字节读取数据
- ByteBuffer的position、flip和clear
- 使用jquery读取html5 localstorage的值的方法
- node.js中的buffer.fill方法使用说明
- 使用J2SE API读取Properties文件的六种方法