为什么ByteBuffer的flip()方法称为“ flip”?什么是“翻转”?根据apidoc,连续两次翻转不会恢复原始状态,多次翻转可能会趋于limit()零。
我可以以某种方式“翻转”重用字节超出限制吗?
我可以将尾部与其他数据连接起来吗?
为什么ByteBuffer的flip()方法称为“ flip”?什么是“翻转”?根据apidoc,连续两次翻转不会恢复原始状态,多次翻转可能会趋于limit()零。
我可以以某种方式“翻转”重用字节超出限制吗?
我可以将尾部与其他数据连接起来吗?
reset改用。
Answers:
一个相当普遍的用例ByteBuffer是逐个构造一些数据结构,然后将整个结构写入磁盘。flip用于将ByteBuffer“从I / O读取”(putting)切换为“写入I / O”(getting):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()!