Java ByteBuffer&x27的目的是什么;什么是翻转法?(为什么叫“翻转”?)

Java ByteBuffer&x27的目的是什么;什么是翻转法?(为什么叫“翻转”?),java,flip,bytebuffer,Java,Flip,Bytebuffer,为什么ByteBuffer的flip()方法称为“flip”?这里的“翻转”是什么?根据apidoc,连续两次翻转不会恢复原始状态,多次翻转可能会使limit()变为零 我能否以某种方式“取消限制”以重用超出限制的字节 我可以将尾部与其他数据连接起来以翻转吗?ByteBuffer的一个相当常见的用例是逐段构造一些数据结构,然后将整个结构写入磁盘flip用于将ByteBuffer从“从I/O读取”(putting)翻转到“写入I/O”(getting):在使用一系列puts填充ByteBuffer

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

我能否以某种方式“取消限制”以重用超出限制的字节


我可以将尾部与其他数据连接起来以翻转吗?

ByteBuffer的一个相当常见的用例是逐段构造一些数据结构,然后将整个结构写入磁盘
flip
用于将
ByteBuffer
从“从I/O读取”(
put
ting)翻转到“写入I/O”(
get
ting):在使用一系列
put
s填充
ByteBuffer
后,
flip
将缓冲区的限制设置到当前位置并将位置重置为零。这会使将来的
get
write
从缓冲区将所有
内容写入缓冲区,不再写入

在完成
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);
}
ByteBuffer b=新的ByteBuffer(1024);

对于(inti=0;i,ByteBuffer的设计很糟糕。有很多体面的程序员抱怨

因此,不要试图对此进行推理,只需仔细研究和使用API即可

现在,我不能在没有其他选择的情况下说它的坏话,所以这里是:


一个缓冲区有一个固定的
容量
;它维护两个指针:
start
end
get()
返回
start
位置的字节,并递增
start
put()
将字节置于
end
位置,递增
end
。无
flip()

翻转将当前位置值指定给limit属性,并将position属性设置为0。翻转仅用于从缓冲区中排出活动元素

例如,下面的程序打印“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());
}
有关缓冲区和通道的更多信息,请参阅。

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


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

它将缓冲区从读取模式“翻转”到写入模式(反之亦然)@BrianRoach:它可以从读转换到写,但如果你不写固定大小的结构,它就没有写到读那么有用。如果要从写转换到读,请使用
reset
。记住询问“目标”问题;或者,至少使主要问题显得客观:D@nneonneo-这不是问题,实际上不会花太多时间解释细节,因此只是一条评论和一个链接。
WritableByteChannel
,如
FileChannel
SocketChannel
。或任何其他具有
写入功能的内容(ByteBuffer)
方法。(它的类型与此无关…)它应该
Buffer.clear
将容量限制和位置重置为0。
Buffer.reset
将仅位置重置为
mark
。@kelveng:你说得对;我已经修改了答案以反映这一点。谢谢你的精彩捕捉!@user963241:从I/O读取到缓冲区,从缓冲区写入到I/O。那么,有什么抱怨吗?如果你有我也有一些个人的不满,但仅仅说“X API糟透了,人们这么说”是不行的。发布链接是你首先要做的一切。我从来没有指责你撒谎,我只是要求你详细说明投诉的来源和性质。在这个地方,人们不会相信某人的话,除非听起来可信。你甚至不需要提供来源。很明显,ByteBuffer设计不当。flip没有达到目的,当你忘记翻转时,它只会引入一个bug源。如果他们感到无法控制地想把它放进去,至少让flipped ByteBuffers和Unfliped ByteBuffers不同的类,这样类型系统就可以捕获bug。这里没有任何东西可以回答这个问题。感谢你提供了到ext的链接ensive coverage!当包含源代码时,它太棒了。java API文档似乎没有解释就使用了“flip”一词,好像这是一个常见的计算机科学术语,但显然有一些人(包括我)没有发现这一点。