0

我目前正在使用 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(第一轮)

这是人们所期望的。现在,根据文档,绑定检查似乎确实成立:

 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?)

4

2 回答 2

2

我认为您不需要pos变量。该put方法试图读取event.getData()位置pos,而我认为您想event.getData()从位置 0 读取。您可以简单地使用batch.put(event.getData())将数组的全部内容附加到缓冲区中。

于 2012-08-24T12:02:14.460 回答
0

如果 tuple_size 对 event.getData() 足够大,您的问题并不明显。如果不是,那将导致您的 IndexOutofBoundsException。也许它已经关闭了一个?

另一种可能性是您的迭代器it仅包含一个元素。

编辑:根据文档,如果您的缓冲区空间不足,您应该得到一个 BufferOverflowException 。从文档中引用:

此方法将字节从给定的源数组传输到此缓冲区。如果要从数组复制的字节数多于此缓冲区中的剩余字节数,即如果 length > remaining(),则不传输任何字节并抛出 BufferOverflowException。

这表明您的问题不是您所期望的。

于 2012-08-24T11:50:58.453 回答