java bytebuffer完全填满

gt0wga4j  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(324)

我目前正在使用java bytebuffer

ByteBuffer batch = ByteBuffer.allocate(tuple_size * batch_size ) ;
    int pos = 0;
    int sent = 0;
    while ( sent++ < batch_size) {
            Event event = (Event) it.next();
            batch.put(event.getData(), pos, tuple_size);
            pos += tuple_size;

        }
    return batch.array();

当前,批处理大小设置为2。我的问题是,在第二轮中,我得到了一个indexootfoundseception,鉴于此,我无法解释,打印出以下细节:

System.out.println(pos + " " +  batch.capacity() +  " " + batch.position() + " " +  batch.remaining());

我得到:0 200 0 200(第0轮)
100(第1轮)
这正是人们所期望的。现在,根据文档,绑定支票似乎确实有效:

offset - The offset within the array of the first byte to be read; must be non-negative and no larger than array.length
 length - The number of bytes to be read from the given array; must be non-negative and no larger than array.length - offset

如何完全填满缓冲区(同时保持底层缓冲区具有长度元组大小*批大小?)

mrzz3bfm

mrzz3bfm1#

从您的问题来看,元组大小是否足以容纳event.getdata()并不明显。如果不是,那将导致您的indexoutofboundsexception。也许是差一点?
另一种可能是迭代器 it 只包含一个元素。
编辑:根据文档,如果缓冲区空间不足,应该会得到bufferoverflowexception。引用文件:
此方法将字节从给定的源数组传输到此缓冲区。如果要从数组中复制的字节数多于此缓冲区中剩余的字节数,即如果length>remaining(),则不传输任何字节,并引发bufferoverflowexception。
这说明你的问题不是你所期望的。

6tdlim6h

6tdlim6h2#

我想你不需要pos变量。这个 put 方法正在尝试读入 event.getData() 在pos位置,当我认为你想读的时候 event.getData() 从位置0开始。你可以简单地使用 batch.put(event.getData()) 将数组的全部内容追加到缓冲区中。

相关问题