集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:15023458194  |   联系客服   |
当前位置:主页 > 培训课程 > Java >

成都java开发:Java NIO中的Buffer类

发布者: 成都达内     浏览次数:     发布时间:2019-05-27 11:12:57

Buffer,即缓冲区,用于批量读写数据。Buffer是一个抽象类,基本数据类型都有实现类:XxxBuffer,比如ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等。...

  Buffer,即缓冲区,用于批量读写数据

  Buffer是一个抽象类,基本数据类型都有实现类:XxxBuffer,比如ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等。

  Buffer更像一个容器,用于盛装数据,可以从数据源读取数据,放在Buffer里,也可以从Buffer中取出数据来用。

  Buffer中的4个概念:

  capacity 容量,此Buffer的大小

  limit 界限,limit是一个下标(索引),limit及以后的数据既不能读,也不能写

  position 记录指针,记录当前读写到的位置

  mark 标记。读写的时候,可在某处做一个标记,调用reset()方法可将记录指针重置到此mark处。

  Buffer使用步骤:

  (1)创建Buffer对象

  static XxxBuffer allocate(int capacity) //静态方法,返回该类对应的Buffer对象

  1 //创建一个容量为10的CharBuffer对象,一次最多可装10个char

  2 CharBuffer charBuffer=CharBuffer.allocate(10);

  (2)往Buffer中放入数据,可使用put()往Buffer中放入数据,也可以从Channel中获取数据。

  1 //XxxBuffer有多个重载的put()方法,但只能放入该种类型的数据。

  2 charBuffer.put(char c); //未指定index的,都是依次放置。一个萝卜一个坑,如果坑中有萝卜,就往后放。往坑中放萝卜时,记录指针会指向这个坑,放完后,记录指针会自动指向下一个坑。

  3 charBuffer.put(int index,char c); //在指定的坑中放萝卜

  4 charBuffer.put(char[] src); //放在多个坑中,一个坑一个char

  5 charBuffer.put(String str); //放在多个坑中,一坑一个char

  6 charBuffer.put(CharBuffer src); //把其他CharBuffer中的所有萝卜都copy一份,放到这个CharBuffer中来,一坑一个char

  (3)数据放置完毕后,调用flip()方法,此方法会将limit设置为position(记录指针)的值,并将position(记录指针)的值置为0。这就标明了可读写的数据区间。

  说明:数据放置完毕后,position(记录指针)是指向最后一个萝卜后面的那个坑的。

  1 charBuffer.flip();

  成都java开发:Java NIO中的Buffer类

  现在,Buffer做好了输出数据的准备。

  (4)从Buffer中取出数据,并使用。

  1 charBuffer.get(); //取一个萝卜。从前往后取,只取一个。

  2 charBuffer.get(int index); //取指定位置上的萝卜

  3 //这里的取是指取出副本,并不是真的把萝卜从坑里拿出来,萝卜还是在这个坑里,不会变。

  (5)当Buffer中的数据都用完了,不需要再保存时,就可以调用clear()清空这个Buffer,这样,每个坑都是空的了,又可以装入新的数据了。

  1 charBuffer.clear();

  示例:

  1 //创建Buffer对象

  2 CharBuffer charBuffer=CharBuffer.allocate(10);

  3

  4 //放入数据

  5 charBuffer.put("ABCD");

  6

  7 //调整指针,准备好使用数据

  8 charBuffer.flip();

  9

  10 //从Buffer中取出数据来使用

  11 System.out.println(charBuffer.get()); //A

  12 System.out.println(charBuffer.get(2)); //取第三个,C

  13 System.out.println(charBuffer.get()); //B

  14

  15 //好啦,这批数据搞定了,不再用了,清空Buffer,准备好下次装入数据

  16 charBuffer.clear();

  17

  18 //装入下一批数据

  19 charBuffer.put('A');

  20

  21 //.........

  观察上面的输出结果,调用get()获取值后,记录指针会自动指向下一个坑。调用get(int index)获取值,记录指针并不会受到影响,还是在原来的位置。

  Buffer类的其他常用方法:

  int capacity() //返回容量

  boolean hasRemaining() //判断是否还有元素可供处理(position、limit之间是否还有萝卜)

  int remaining() //还有多少个元素未处理

  int limit() //返回limit的位置

  limit(int newLimit) //重新设置limit(以新Buffer的形式返回,但原Buffer的limit会改变)

  int position() //返回当前记录指针的位置

  position(int newPosition) //重置position的位置

  mark() //在当前position的位置做一个标记

  reset() //转到标记处,即将position指向mark处

  rewind() //将position重置为0,取消设置的mark,即从头开始。

  通过 allocate() 创建的Buffer是普通Buffer。

  ByteBuffer提供了 allocateDirect() 来创建直接Buffer,直接Buffer读取数据的效率很高,但创建成本很高,适合用于创建生存期较长的Buffer。一般情况用普通Buffer即可。

  只有ByteBuffer类能创建直接Buffer。

(责任编辑:范老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:绵阳市涪城区临园路东段68号富临大都会7栋3单元9层12号

联系电话:15023458194

公交路线:富乐路口凯德广场(10路;29路;3路;15路;11路;15a路;71路)

校区地址:成都市锦江区东大街紫东楼端35号明宇金融广场19楼1906室

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:15023458194

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:15023458194

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:15023458194

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座16层

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都市人民南路一段86号“城市之心”大厦26楼

联系电话:15023458194

公交路线:成都市人民南路(6路;14路;42路;72路;76路;1010路;)

校区地址:成都市高新区奥克斯广场B座1708

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

2016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56