NIO学习-Buffer

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 决定

相关文章
相关标签/搜索