缓冲器(Buffer)的细节
来源:互联网 发布:沈阳i5数控车怎样编程 编辑:程序博客网 时间:2024/06/05 17:42
从上面继承图层来看,了解Buffer很重要。
Buffer=数据+四个索引
正是四个索引才是的数据可以高效访问,这四个索引是:mark(标记),position(位置),limit(界限),capacity(容量)。
不变式
标记、位置、限制和容量值遵守以下不变式:
0 <= 标记 <=位置 <= 限制 <= 容量
以下是设置和复位索引以及查询的方法:
capacity() :返回此缓冲区的容量。
clear() :清除此缓冲区。
flip() :反转此缓冲区。
limit() :返回此缓冲区的限制。
limit(int newLimit) :设置此缓冲区的限制。
mark() :在此缓冲区的位置设置标记。
position() :返回此缓冲区的位置。
position(int newPosition) :设置此缓冲区的位置。
remaining() :返回当前位置与限制之间的元素数。
reset() :将此缓冲区的位置重置为以前标记的位置。
rewind() :重绕此缓冲区。
通过代码查看:
package org.com.mayi;import java.nio.ByteBuffer;import java.nio.CharBuffer;public class Test_ByteBuffer {static int capacity1,limit1,position1;/** * @param args */public static void main(String[] args){byte[] b = "my test".getBytes();//获取字节数组ByteBuffer bytebuffer =ByteBuffer.allocate(15);//定义一个buffer,并为之分配容量。bytebuffer.put(b);//把字节放进buffer capacity1 = bytebuffer.capacity();//返回buffer容量 limit1 = bytebuffer.limit();//返回buffer界限 position1 = bytebuffer.position();//返回buffer位置 /*没有设置mark(标记), */ System.out.println("容量:"+capacity1+" 界限:"+limit1+" 位置: "+position1+" mark:"+"需要自己设置"); //反转此缓冲区,从结果来看,我们知道,capacity不变,limit=position ;position=0; //此时的buffer感觉就像队列一样,先进先出。 bytebuffer.flip(); capacity1 = bytebuffer.capacity(); limit1 = bytebuffer.limit(); position1 = bytebuffer.position(); System.out.println("容量:"+capacity1+" 界限:"+limit1+" 位置: "+position1+" mark:"+"需要自己设置"); //重绕此缓冲区,其实就是相当于刷新一下,通知buffer做好读或写的准备,并没有什么改变。 bytebuffer.rewind(); capacity1 = bytebuffer.capacity(); limit1 = bytebuffer.limit(); position1 = bytebuffer.position(); System.out.println("容量:"+capacity1+" 界限:"+limit1+" 位置: "+position1+" mark:"+"需要自己设置");}}
输出:
容量:15 界限:15 位置: 7 mark:需要自己设置容量:15 界限:7 位置: 0 mark:需要自己设置容量:15 界限:7 位置: 0 mark:需要自己设置
通过查看API文档,又找到一些官方解释:哈哈。。。
清除、反转和重绕
除了访问位置、限制、容量值的方法以及做标记和重置的方法外,此类还定义了以下可对缓冲区进行的操作:
clear()
使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。flip()
使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。rewind()
使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。
理解了这四个索引的工作是很重要的,做到数据输入输出时,缓冲区在干什么,心中有数,不至于茫茫然,看别人的代码这样写,你也稀里糊涂的跟着写了。
如果有兴趣,可以查看《java编程思想》的NIO那一章,有很详细的解释,里面是图文结合,比我的好多了。我在这里写下,也只是做一个简单笔记罢了。。。
- 缓冲器(Buffer)的细节
- 缓冲器(Buffer)的细节
- 缓冲器(Buffer)的细节
- ARM的cache和写缓冲器(write buffer)
- ARM的cache和写缓冲器(write buffer)
- ARM的cache和写缓冲器(write buffer)
- Java I/O的缓冲器细节
- Node.js缓冲器Buffer
- TLB(translation lookaside buffer)转换后援缓冲器
- TLB(translation lookaside buffer)转换后援缓冲器
- Java NIO使用及原理之--缓冲器buffer(1)
- Java NIO使用及原理之--缓冲器buffer(2)
- NIO Buffer的细节
- 环形缓冲器 circular buffer, ring buffer
- 【VOLTE】什么是jitter buffer-抖动缓冲器
- golang 读出缓冲器(缓冲器变小)
- Cache(高速缓冲器)
- ByteBuffer 缓冲器(一)
- 获取堆栈信息
- 如何让administrator帐户出现在登陆画面?
- 八个吸引用户使用的应用设计技巧
- Asp.net性能的技巧
- Delphi的学习笔记十一——类4
- 缓冲器(Buffer)的细节
- boost/lexical_cast.hpp的简单使用方法
- 盗墓札记
- linux内核中的copy_to_user和copy_from_user(一)
- c++多线程例(事件同步对象,变量共享)
- make an patch for dvrrdk demos
- jTemplates jquery数据绑定控件
- 代码之美 - 如何写出优雅的PHP代码
- Eclipse安装插件的方法和步骤