当前位置: 代码迷 >> 综合 >> ByteBuffer中的 clear、flip、rewind三个方法区别、以及如何使用
  详细解决方案

ByteBuffer中的 clear、flip、rewind三个方法区别、以及如何使用

热度:72   发布时间:2023-11-03 04:22:30.0

 

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

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

Java代码

   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;  }  

 

  1.         仔细思考一下: 例如共有100个字节, ok!那么知道最后一次向buffer中实际读取的是10个字节,如果我在  
  2.                “print(buffer);”之后加入 buffer.flip();代码,那么最后一次buffer的中position仅加了10次。 那如果不加  
  3.         这行代码的话,会不会出现我们文章开头的错误呢? 结果是 :“会的”  
  相关解决方案