ByteBuffer的翻转方法的目的是什么?(为什么称它为"翻转"?)

Suz*_*ioc 84 java bytebuffer flip

为什么ByteBuffer的flip()方法称为"翻转"?什么是"翻转"在这里?根据apidoc,连续两次翻转将不会恢复原始状态,并且多次翻转可能趋于limit()变为零.

我能以某种方式"解开"重用字节超出限制吗?

我可以将尾部连接到其他一些数据吗?

nne*_*neo 113

一个相当常见的用例ByteBuffer是逐个构造一些数据结构,然后将整个结构写入磁盘.flip用于将ByteBuffer"从I/O读取"(putting)翻转为"写入I/O"(getting):在使用puts 序列填充之后ByteBuffer,flip将缓冲区的限制设置为当前位置并将位置重置为零.这具有使未来getwrite从缓冲区写入缓冲区中的所有内容的效果,put而不再是.

完成后put,您可能希望重用它ByteBuffer来构造另一个数据结构.为了"解开"它,打电话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);
}
Run Code Online (Sandbox Code Playgroud)

  • 或者其他任何具有`write(ByteBuffer)方法的东西.(它的类型不是真正相关......) (6认同)

Arn*_*Rao 9

Flip 将当前位置值分配给 limit 属性并将 position 属性设置为 0。Flip 可用于仅从缓冲区中排出活动元素。

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

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());
}
Run Code Online (Sandbox Code Playgroud)

有关缓冲区和通道的更多信息,请参见http://www.zoftino.com/java-nio-tutorial