ByteBuffer的flip()方法为什么被称为“flip”?这里的“flipped”是什么意思?根据API文档,连续两次翻转不会恢复原始状态,并且多次翻转可能会导致limit()变为零。
我是否可以以某种方式“取消翻转”,以便重用已超出限制的字节?
我是否可以将尾部与其他数据连接起来进行翻转?
我是否可以以某种方式“取消翻转”,以便重用已超出限制的字节?
我是否可以将尾部与其他数据连接起来进行翻转?
ByteBuffer
的常见用途之一是逐步构建某些数据结构,然后将整个结构写入磁盘。使用flip
从“读I/O”(使用put
)翻转到“写I/O”(使用get
):在使用put
序列填充ByteBuffer
后,flip
将设置缓冲区的限制为当前位置,并将位置重置为零。这会使得未来从缓冲区get
或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);
}
FileChannel
或SocketChannel
。 - nneonneowrite(ByteBuffer)
方法的东西。(它的类型并不重要...) - Stephen CBuffer.clear
来将限制重置为容量并将位置重置为0。Buffer.reset
仅将位置重置为“标记”。 - Kelvin NgFlip将当前位置的值赋给限制属性,同时将位置属性设置为0
。 Flip可用于从缓冲区中仅排除活动元素。
例如,下面的程序打印“hello”而不是缓冲区的空元素。方法调用limit
和position
可以替换为flip
。
CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello");
// These two lines below are 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了解有关缓冲区和通道的更多信息。
flip()方法使缓冲区准备好进行新的通道写入或相对获取操作:它将限制设置为当前位置,然后将位置设置为零。
缓冲区跟踪写入其中的数据。在写入后,调用flip()方法以从写入模式切换到读取模式。
缓冲区具有固定的 capacity
;它维护2个指针:start
和 end
。 get()
返回 start
位置的字节并递增 start
。 put()
将字节放置在 end
位置并递增 end
。没有 flip()
!
compact
是一般使用情况下 flip
的相反操作。
buf = ByteBuffer.allocate(...); // create
buf.put(...); // write
buf.flip(); // get ready to read
buf.get(...); // read some of the data
buf.compact(); // delete the read data and get ready to write again