ByteBuffer的翻转方法的目的是什么? (为什么它被称为“翻转”?)
为什么ByteBuffer的flip()方法被称为“flip”? 什么是“翻转”在这里? 根据apidoc,两个连续的翻转不会恢复原来的状态,并且多次翻转可能趋于limit()
成为零。
我可以“解开”以某种方式重用字节超出限制吗?
我可以连接尾部与其他数据翻转吗?
ByteBuffer
一个相当常见的用例是逐个构造一些数据结构,然后将整个结构写入磁盘。 flip
用于将ByteBuffer
从“从I / O读取”( put
)转换为“写入I / O”( get
):在使用一系列put
s来填充ByteBuffer
, flip
将设置限制缓冲区的当前位置和重置位置为零。 这有一个作用,即将来自缓冲区的写入或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个指针: start
和end
。 get()
返回start
位置的字节并增加start
。 put()
把字节放在end
位置并递增end
。 没有flip()
!