我想换一种方式描述ByteBuffer中的 clear、flip、rewind三个方法区别、以及如何使用...

我在网上搜索了很多,大部分都是说针对mark、limit、capacity、position 标志量来解释的,ok!我想补充一下,从如何应用的方面来说明其含义。

例如:
1、有一个文件共有20个字符:
abcdefghijklmnopqrst
2、我们声明一个char[15] buffer 大小的字符数组


for(readChar(buffer ) != -1) { //将文件的字符读入到buffer中,一次最多读15个
println(toString(buffer)) ;//打印当前结果
}
期望结果:abcdefghijklmnopqrst
实际输出: abcdefghijklmnopqrst[b]fghijklmnopqrst[/b]

ok 这结果显然是错误的:
第一次buffer的结果是:
abcdefghijklmno (15个字符)
第二次buffer的结果是
pqrstfghijklmno(前面5个字符是第二次读取的, 后面的10个字符是第一次读取的 )

所以接下俩我们应该改造一下代码:
int pos;
for((pos=readChar(buffer)) != -1) { //将文件的字符读入到buffer中,一次最多读15个
println(toString(buffer, 0, pos)) ;//打印当前结果
}
期望结果:abcdefghijklmnopqrst
实际输出: abcdefghijklmnopqrst

很显然这次是正确的。

ok,那我们从这个角度是思考ByteBuffer,我们同样需要ByteBuffer对象中的标志符去控制类似的情况
ByteBuffer buffer = ByteBuffer.alloate(20);
while(read(buffer ) > 0) { //每次写一个值,position都会加1
//读值时,我们当然要从起始开始位置读了,所以执行,读到limit位置结束
buffer.rewind();
print(buffer);
//那flip、clear,什么时候执行呢,其中clear方法,是将ByteBuffer标识重置为初始状态,ok那我们来说说flip
我对flip的理解是 提高效率。
首先看一下flip代码:
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
仔细思考一下: 例如共有100个字节, ok!那么知道最后一次向buffer中实际读取的是10个字节,如果我在
“print(buffer);”之后加入 buffer.flip();代码,那么最后一次buffer的中position仅加了10次。 那如果不加
这行代码的话,会不会出现我们文章开头的错误呢? 结果是 :“会的”



ok! 以上是我对该问题的描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值