什么是字节缓冲区的倒装法的目的是什么? (为什么叫“炫”?)(What is the purpo

2019-07-19 15:58发布

为什么字节缓冲区的翻转()方法被称为“翻转”? 什么是“翻转”在这里? 据apidoc,两个连续的空翻不会恢复原来的状态,并多次翻转可能会倾向于limit()变成零。

我可以“unflip”莫名其妙地重用字节出去的限制吗?

我可以连接尾部与其他一些数据翻转?

Answer 1:

一个相当普遍的使用情况下,用于ByteBuffer是构造一些数据结构块逐片,然后将该整体结构写入到磁盘。 flip使用翻转ByteBuffer从“从I / O读”( put婷)以“写I / O”( get婷):序列后put用来s到填充ByteBufferflip将设置上限缓冲区的当前位置和所述位置复位到零。 这具有使未来的效果getwrite从缓存写入的所有东西被put到缓冲区,并没有更多的。

完成后put ,你可能要重复使用的ByteBuffer构建另一种数据结构。 为了“unflip”它,需要clear 。 这将重置限制的能力(使所有可用的缓冲器的),位置为0。

因此,一个典型的使用场景:

ByteBuffer b = new ByteBuffer(1024);
for(int i=0; i<N; i++) {
    b.clear();
    b.put(header[i]);
    b.put(data[i]);
    b.flip();
    out.write(b);
}


Answer 2:

翻转分配当前位置值的限制属性,并设置为仅排出从缓冲器有源元件的位置属性为0倒装是有用的。

例如,下面的程序打印“你好”缓冲器的未空元素。 方法调用极限和位置可以翻转更换。

CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello"); 
// what below two line of code is what flip does
cbuff.limit(cbuff.position());
cbuff.position(0);      
while(cbuff.hasRemaining()) {
    System.out.println(cbuff.get());
}

见http://www.zoftino.com/java-nio-tutorial对缓冲区和通道的更多信息。



Answer 3:

字节缓冲区是生病设计。 有很多来自体面的程序员抱怨。

所以,不要试图来思考它,只是学习和认真使用API​​。

现在,我不能没有提出替代唱衰它,所以这里是:

缓冲器具有固定的capacity ; 它保持2个指针: startendget()的返回字节start位置和增量startput()在把字节end位置和增量end 。 没有flip()



Answer 4:

翻转()方法使缓冲区准备好信道写入或相对get操作的一个新的序列:它设置了限制的当前位置,然后设置位置到零。

缓冲区跟踪写入它的数据。 交的写入, 倒装()方法被调用来从写入读取模式切换。



文章来源: What is the purpose of ByteBuffer's flip method? (And why is it called “flip”?)