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

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

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

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

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

完成put ,可能需要重用ByteBuffer来构造另一个数据结构。 要“解开”它,请打电话通知。 这将重置容量限制(使所有缓冲区可用),并将位置设置为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); } 

ByteBufferdevise不当。 有很多来自正规程序员的抱怨。

所以不要试图推理,只是仔细学习和使用API​​。

现在,我不能不提出一个替代品,它是这样的:

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