JAVA语言之详解Java NIO中的Buffer类
从安 2019-06-06 来源 : 阅读 1300 评论 0

摘要:本篇文章主要讲述JAVA语言之详解Java NIO中的Buffer类,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

本篇文章主要讲述JAVA语言之详解Java NIO中的Buffer类,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

JAVA语言之详解Java NIO中的Buffer类

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();

现在,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。

 

本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

本文由 @从安 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程