我已经看过每次都在for循环中标记和休息缓冲区位置的生产代码。有必要吗?
*/
public static void writeToBuffer(final List<ByteBuffer> attachments, final ByteBuffer buffer) {
for (ByteBuffer buf : attachments) {
buf.mark();
// copy content of buf to buffer
buf.reset();
}
}
答案 0 :(得分:3)
是的,如果您希望能够在稍后在代码中开始在循环中阅读它们之前返回缓冲区位置,那是必要的。
示例:强>
开始读取缓冲区之前的位置,这是设置标记的位置
- X -------------
//读取缓冲区后,位置(可能)在最后
---------------- X
//重置调用将移回标记位置,以便我们再次读取字节。
- X -------------
来自java doc:
缓冲区标记是调用重置方法时其位置将被重置的索引。标记并不总是被定义,但是当它被定义时,它永远不会是负数,并且永远不会大于位置。如果定义了标记,则在将位置或限制调整为小于标记的值时将其丢弃。如果未定义标记,则调用reset方法会导致抛出InvalidMarkException。