我目前正在使用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();
目前,batch_size设置为2.我的问题是,在第二轮,我得到一个IndexOutofBoundsException,我无法解释,因为打印出以下详细信息:
System.out.println(pos + " " + batch.capacity() + " " + batch.position() + " " + batch.remaining());
我得到: 0 200 0 200(第0轮)
100 200 100 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
如何完全填满缓冲区? (同时保持底层缓冲区的长度为tuple_size * batch_size?)
答案 0 :(得分:2)
我认为您不需要 pos 变量。 put
方法正在尝试在位置 pos 中读入event.getData()
,而我认为您想要从位置0读取event.getData()
。您只需使用{{ 1}}将数组的全部内容附加到缓冲区中。
答案 1 :(得分:0)
从你的问题来看,tuple_size对于event.getData()是否足够大是不明显的。 如果不是,那将导致您的IndexOutofBoundsException。 也许是一个人呢?
另一种可能性是你的迭代器it
只包含一个元素。
编辑:根据文档,如果缓冲区空间不足,则应该获得BufferOverflowException。 从文档中引用:
此方法将字节从给定源传输到此缓冲区 阵列。如果要从阵列复制的字节数多于剩余的字节数 在该缓冲区中,即,如果长度>剩余(),然后没有字节 转移并抛出BufferOverflowException。
这表明你的问题不是你所期望的。