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

问题描述 投票:75回答:4

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

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

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

java flip bytebuffer
4个回答
105
投票

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

在完成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);
}

3
投票

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

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


0
投票

ByteBuffer设计不合理。来自体面的程序员有很多抱怨。

因此,不要试图推理它,只需仔细研究和使用API​​。

现在我不能在没有提出替代方案的情况下bad骂它,所以这里是:

缓冲区有固定的capacity;它维持2个指针:startendget()返回start位置的字节并递增startput()将字节放在end位置并增加end。没有flip()


0
投票

flip()方法使缓冲区为通道写入或相对获取操作的新序列做好准备:它将限制设置为当前位置,然后将位置设置为零。

缓冲区跟踪写入其中的数据。写入后,调用flip()方法从写入切换到读取模式。

© www.soinside.com 2019 - 2024. All rights reserved.