`

我想换一种方式描述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! 以上是我对该问题的描述


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics