Java缓冲区在for循环中标记和重置

Java缓冲区在for循环中标记和重置,java,bytebuffer,Java,Bytebuffer,我见过生产代码,每次都在for循环中标记并放置初始化的缓冲区位置。有必要吗 */ public static void writeToBuffer(final List<ByteBuffer> attachments, final ByteBuffer buffer) { for (ByteBuffer buf : attachments) { buf.mark(); // copy content of buf to buffer

我见过生产代码,每次都在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();
    }
}
*/
公共静态无效writeToBuffer(最终列表附件、最终ByteBuffer缓冲区){
用于(ByteBuffer buf:附件){
buf.mark();
//将buf的内容复制到缓冲区
buf.reset();
}
}

是,如果您希望在代码后面的循环中开始读取缓冲区之前能够返回缓冲区位置,则这是必要的

示例:

开始读取缓冲区之前的位置,这是设置标记的位置

--x-------------

//读取缓冲器后,位置(可能)在末端

----------------X

//调用重置将移回标记位置,以便我们可以再次读取字节

--x-------------

从:

缓冲区的标记是在调用reset方法时其位置将重置到的索引。标记并不总是被定义的,但当它被定义时,它永远不会是负数,也永远不会大于位置。如果定义了标记,则当位置或限制调整为小于标记的值时,该标记将被丢弃。如果未定义标记,则调用reset方法会导致引发InvalidMarkException


是的,这是必要的,如果您希望能够在代码后面的循环中开始读取缓冲区之前返回缓冲区位置

示例:

开始读取缓冲区之前的位置,这是设置标记的位置

--x-------------

//读取缓冲器后,位置(可能)在末端

----------------X

//调用重置将移回标记位置,以便我们可以再次读取字节

--x-------------

从:

缓冲区的标记是在调用reset方法时其位置将重置到的索引。标记并不总是被定义的,但当它被定义时,它永远不会是负数,也永远不会大于位置。如果定义了标记,则当位置或限制调整为小于标记的值时,该标记将被丢弃。如果未定义标记,则调用reset方法会导致引发InvalidMarkException


视情况而定。什么是
attachments
,在
for
循环完成后如何使用它?在for循环完成后,buf甚至在
for
循环之外可用。在本例中,这是函数的结尾。我更新了代码示例以包含函数您已经更新了代码以显示方法签名,但您仍然没有说明在方法返回后附件会发生什么情况。调用方是否重新读取了
附件
列表中的缓冲区?我认为在每个
循环
中标记和
重置
的原因是我们每次都可以将
附件
的每个成员的内容复制到
buf
的位置0,这样我们就可以避免分配过多的空间。如果我们不重置,在下一次迭代中,额外的内容将被复制到当前位置的末尾。我的解释有道理吗?要看情况。什么是
attachments
,在
for
循环完成后如何使用它?在for循环完成后,buf甚至在
for
循环之外可用。在本例中,这是函数的结尾。我更新了代码示例以包含函数您已经更新了代码以显示方法签名,但您仍然没有说明在方法返回后附件会发生什么情况。调用方是否重新读取了
附件
列表中的缓冲区?我认为在每个
循环
中标记和
重置
的原因是我们每次都可以将
附件
的每个成员的内容复制到
buf
的位置0,这样我们就可以避免分配过多的空间。如果我们不重置,在下一次迭代中,额外的内容将被复制到当前位置的末尾。我的解释有意义吗?但是OP显示
reset()
发生在
for
块的末尾,后面没有更多的语句。@DodgyCodeException我明白了,我的答案有点不清楚,我会澄清它。谢谢你的关注!
buf
的范围在
for
循环中,对吗?每个
for
循环将创建一个新的
buf
,因此我仍然不明白为什么必须
标记
重置
@niepan“每个循环将创建一个新的
buf
”—是的,但这是对现有ByteBuffer对象的新引用。循环之后,ByteBuffer对象不会消失。它仍然可以作为
附件
列表的一个元素访问。但是OP显示
重置()
发生在
for
块的末尾,后面没有更多的语句。@DodgyCodeException我明白了,我的答案有点不清楚,我会澄清它。谢谢你的关注!
buf
的范围在
for
循环中,对吗?每个
for
循环将创建一个新的
buf
,因此我仍然不明白为什么必须
标记
重置
@niepan“每个循环将创建一个新的
buf
”—是的,但这是对现有ByteBuffer对象的新引用。循环之后,ByteBuffer对象不会消失。它仍然可以作为
附件
列表的一个元素访问。