为什么ByteBuffer的flip()方法称为“ flip”?什么是“翻转”?根据apidoc,连续两次翻转不会恢复原始状态,多次翻转可能会趋于limit()
零。
我可以以某种方式“翻转”重用字节超出限制吗?
我可以将尾部与其他数据连接起来吗?
为什么ByteBuffer的flip()方法称为“ flip”?什么是“翻转”?根据apidoc,连续两次翻转不会恢复原始状态,多次翻转可能会趋于limit()
零。
我可以以某种方式“翻转”重用字节超出限制吗?
我可以将尾部与其他数据连接起来吗?
reset
改用。
Answers:
一个相当普遍的用例ByteBuffer
是逐个构造一些数据结构,然后将整个结构写入磁盘。flip
用于将ByteBuffer
“从I / O读取”(put
ting)切换为“写入I / O”(get
ting):put
使用s序列填充后ByteBuffer
,flip
会将缓冲区的限制设置为当前位置并将位置重置为零。这具有使futureget
或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);
}
out
?
write(ByteBuffer)
方法的东西。(它的类型到底有多大关系……)
Buffer.clear
将容量和位置的限制Buffer.reset
重置为0。仅将位置重置为mark
。
翻转将当前位置值分配给limit属性,并将position属性设置为0。翻转仅用于从缓冲区中清空活动元素。
例如,下面的程序打印“ hello”不是缓冲区的空元素。方法调用的限制和位置可以用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。
ByteBuffer设计不良。体面的程序员抱怨很多。
因此,请勿尝试推理,只需仔细研究和使用API。
现在,我不能不提出替代方案而对其作废,所以这里是:
缓冲区有固定值capacity
; 它维护2个指针:start
和end
。get()
返回该start
位置的字节并递增start
。put()
将字节放在end
位置并递增end
。没有flip()
!