为什么ByteBuffer的flip()方法称为“翻转”?什么是“翻转”在这里?根据apidoc,连续两次翻转将无法恢复原始状态,并且多次翻转可能会使limit()
变为零。
我能以某种方式“解开”重用字节超出限制吗?
我可以将尾部连接到其他一些数据吗?
答案 0 :(得分:105)
ByteBuffer
的一个相当常见的用例是逐个构造一些数据结构,然后将整个结构写入磁盘。 flip
用于将ByteBuffer
从“从I / O读取”(put
ting)翻转为“写入I / O”(get
ting): put
s的序列用于填充ByteBuffer
,flip
将缓冲区的限制设置为当前位置并将位置重置为零。这样可以使缓冲区中的未来get
或write
将所有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);
}
答案 1 :(得分: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。
答案 2 :(得分:0)
ByteBuffer设计不合理。来自体面的程序员有很多抱怨。
所以不要试图推理它,只需仔细研究和使用API。
现在我不能在不提出替代方案的情况下bad骂它,所以这就是:
缓冲区具有固定的capacity
;它保留了2个指针:start
和end
。 get()
返回start
位置的字节并递增start
。 put()
将字节置于end
位置并递增end
。没有flip()
!
答案 3 :(得分:0)
flip()方法使缓冲区为新的通道写入或相对get操作序列做好准备:将限制设置为当前位置,然后将位置设置为零。
缓冲区跟踪写入其中的数据。写后,调用 flip()方法可从写模式切换到阅读模式。