为什么字节缓冲区的翻转()方法被称为“翻转”? 什么是“翻转”在这里? 据apidoc,两个连续的空翻不会恢复原来的状态,并多次翻转可能会倾向于limit()
变成零。
我可以“unflip”莫名其妙地重用字节出去的限制吗?
我可以连接尾部与其他一些数据翻转?
为什么字节缓冲区的翻转()方法被称为“翻转”? 什么是“翻转”在这里? 据apidoc,两个连续的空翻不会恢复原来的状态,并多次翻转可能会倾向于limit()
变成零。
我可以“unflip”莫名其妙地重用字节出去的限制吗?
我可以连接尾部与其他一些数据翻转?
一个相当普遍的使用情况下,用于ByteBuffer
是构造一些数据结构块逐片,然后将该整体结构写入到磁盘。 flip
使用翻转ByteBuffer
从“从I / O读”( put
婷)以“写I / O”( get
婷):序列后put
用来s到填充ByteBuffer
, flip
将设置上限缓冲区的当前位置和所述位置复位到零。 这具有使未来的效果get
或write
从缓存写入的所有东西被put
到缓冲区,并没有更多的。
完成后put
,你可能要重复使用的ByteBuffer
构建另一种数据结构。 为了“unflip”它,需要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);
}
翻转分配当前位置值的限制属性,并设置为仅排出从缓冲器有源元件的位置属性为0倒装是有用的。
例如,下面的程序打印“你好”缓冲器的未空元素。 方法调用极限和位置可以翻转更换。
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对缓冲区和通道的更多信息。
字节缓冲区是生病设计。 有很多来自体面的程序员抱怨。
所以,不要试图来思考它,只是学习和认真使用API。
现在,我不能没有提出替代唱衰它,所以这里是:
缓冲器具有固定的capacity
; 它保持2个指针: start
和end
。 get()
的返回字节start
位置和增量start
。 put()
在把字节end
位置和增量end
。 没有flip()
翻转()方法使缓冲区准备好信道写入或相对get操作的一个新的序列:它设置了限制的当前位置,然后设置位置到零。
缓冲区跟踪写入它的数据。 交的写入, 倒装()方法被调用来从写入读取模式切换。