buffer 是在通道中传输数据的媒介,根据数据类型的不一样,分为ByteBuffer\CharBuffer\DoubleBuffer...等。根据缓存区的位置又分为 【直接缓存区\物理缓存区】与【非直接缓存区\jvm缓存区】java
下面是buffer的主要属性缓存
1. capacity 是这个buffer最大的存储容量。在建立时指定,且不能改变jvm
ByteBuffer buffer = ByteBuffer.allocate(1024);//capacity 值为1024。将不会再变
2.position 位置,表示缓冲区中正在操做数据的位置post
ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put("abc".getBytes()); //往当前buffer填充3个字节的空间 System.out.println(buffer.position()); // 输出:3,同时也告知你下个要操做的位置是3
3. limit 界限,表示缓冲区中能够操做数据的大小(limit 后数据不能进行读写)code
buffer.flip(); //测定当前有效数据的位置 System.out.println(buffer.limit()); //输出:3,告知在该buffer有效数据策长度是3.后面数据为空(不可操做)
*当buffer没有执行flip()方法时,limt的值都和capacity 同样。这样读取的对方,他是不知道buffer里面到到底有多少空间是有值的。这也是limt属性的职责所在。
* 当调用flip()方法时,也意味着你进行一“读模式”。那么position的值将变成0,也就是是你读取的当前位置在0ip
4.对buffer进行读取ci
byte[] bytes = new byte[2]; buffer.get(bytes); //读取了2个字节,那么下次读取的位置在2 System.out.println(buffer.position()); // 输出:2
buffer.rewind(); //重置读取的状态,即position=0 buffer.clear(); //清空缓冲区,即设置position=0,limit=capacity
* clear()方法表示清空,但实际上buffer只是改变了它的标记位置。实际的内容是存在的rem
5. mark 标记,表示当前position的位置,可能经过reset()恢复到mrak的位置get
byte[] bytes = new byte[1]; buffer.get(bytes); //读取了1个字节,当前position = 1 buffer.mark(); //标记了当前位置在1,mark = 1 buffer.position(3); //手动设置postion = 3 System.out.println(buffer.position()); //输出:3 buffer.reset(); //回到mark所标记的位置 System.out.println(buffer.position()); //输出:1
6. 查询缓冲区是否还有可操做的空间,及剩余可操做空间的大小it
ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put("abc".getBytes()); buffer.hasRemaining(); //还能够再填充数据(还可操做) buffer.remaining() //1021 可操做的空间大小为:1021
*当buffer处在读模式的时,buffer可操做空间的最大值由limt决定。而在写模式时,buffer可操做空间的最大值由capacity 决定