最近对VAS中的socket 中的包头从16位调整为32位,此调整涉及到了Nio ByteBuffer 。
* capacity:指buffer最大能放大少数据,此一般在buffer在创建时被指定
* limit:指buffer在进行读写操作时,不能超过此下标,在写时limit 与 capacity一般相等,当读数据时,limit为有效数据的长度。
* position:指操作的当前下标 可以理解为指针,读写一个数据,指针下移
* mark:指临时存放下标的指,当进行mark()操作时,mark会保存position的值,当进行reset()操作时,又把mark的指赋予position值 ,mark的值总是小于等于position的值。
* flip: 把limit设置为当前position,同时把position设置为0 在读出数据前调用 即把指针放到开始位置,读数据时只读到限制位置
* compact:把当前从position位置到limit位置的字节移动到从0开始
* clear:重置了缓冲区的主要索引值.不必为了每次读写都创建新的缓冲区,那样做会降低性能
0 <= mark <= position <= limit <= capacity
存在的疑问:mark() ,reset() 方法,在代码测试中,测试不出使用mark,reset方法的场景,不知是如何使用??
package com.binary;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
public class ByteBufferTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ByteBuffer bb = ByteBuffer.allocate(8);
ByteBuffer ccBuffer = ByteBuffer.allocate(8);
String infoString = "";
String testStrString = "wuxhtest";
bb = ByteBuffer.wrap(testStrString.getBytes());
byte[] tmp = new byte[8];
tmp = bb.array();
System.out.println("length:" + testStrString.length() + " "
+ new String(tmp));
log("当字节数组包装后", bb);
// 读ByteBuffer的数据
System.out.println((char) bb.get());
System.out.println((char) bb.get());
log("get读取数据后", bb);
bb.mark();
log("mark标记后", bb);
// bb.flip();
// log("flip后", bb);
System.out.println((char) bb.get());
System.out.println((char) bb.get());
log("get读取数据后", bb);
bb.reset();
log("reset后", bb);
// 把limit设为当前position,把position设为0,一般在从Buffer读出数据前调用。
bb.flip();
log("flip后", bb);
bb.compact();
log("compact后", bb);
// 放入数据
bb.put((byte) 12);
try {
log("put 放入数据 " + new String(bb.array(), "GBK"), bb);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bb.clear();
log("clear后", bb);
}
public static void log(String info, ByteBuffer bb) {
System.out.println("info:" + info + ": position:" + bb.position()
+ " limit:" + bb.limit() + " capacity:" + bb.capacity()
+ " mark:" + bb.mark());
}
}
执行结果:
写道
length:8 wuxhtest
info:当字节数组包装后: position:0 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]
w
u
info:get读取数据后: position:2 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=2 lim=8 cap=8]
info:mark标记后: position:2 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=2 lim=8 cap=8]
x
h
info:get读取数据后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:reset后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:flip后: position:0 limit:4 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=4 cap=8]
info:compact后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:put 放入数据 wuxhest: position:5 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=5 lim=8 cap=8]
info:clear后: position:0 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]
分享到:
相关推荐
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...
NULL 博文链接:https://zheng12tian.iteye.com/blog/1094811
NULL 博文链接:https://chinaestone.iteye.com/blog/468138
JAVA NIO学习资料JAVA NIO学习资料
Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...
Java NIO英文高清原版
Java NIO 主要类,包含类和函数,没有函数说明,类有简要说明
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用
本类,是专门为了处理大文件,按行读取开发的类。 采用读文件的缓存 fbb 1024*5 行缓存 bb 256 字节 设计思想: 每次通过nio读取字节到 fbb中 然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 ...
java NIO的基本知识点学习笔记,不包含具体代码
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...
java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket
java nio入门学习,两个pdfjava nio入门学习,两个pdf
java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...
使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com
java学习笔记1(java io/nio)设计模式
java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...
java NIO.zip