ByteBuffer的翻转方法的目的是什么?(为什么它被称为“翻转”?

2022-08-31 09:51:39

为什么ByteBuffer的flip()方法被称为“flip”?这里的“翻转”是什么?根据apidoc的说法,两次连续翻转不会恢复原始状态,多次翻转可能会趋向于零。limit()

我可以以某种方式“取消翻转”以重用超出限制的字节吗?

我可以将尾巴与其他一些数据连接起来翻转吗?


答案 1

一个相当常见的用例是逐个构造一些数据结构,然后将整个结构写入磁盘。 用于将“从 I/O 读取”(ting) 翻转为“写入 I/O”(ting):在使用一系列 s 填充后,将缓冲区的极限设置为当前位置并将位置重置为零。这具有使将来或从缓冲区中写入所有内容到缓冲区中的效果,而不是更多。ByteBufferflipByteBufferputgetputByteBufferflipgetwriteput

完成 后,您可能希望重用 来构造另一个数据结构。要“取消翻转”它,请调用 .这会将限制重置为容量(使所有缓冲区都可用),并将位置重置为 0。putByteBufferclear

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

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

答案 2

Flip 将当前位置值分配给 limit 属性,并将位置属性设置为 。翻转对于仅从缓冲区中排出活动元素非常有用。0

例如,下面的程序打印“hello”而不是缓冲区的空元素。方法调用,并且可以替换为 。limitpositionflip

CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello"); 
// These two lines below are 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


推荐