Java Bytebuffer完全填满

时间:2012-08-24 11:43:38

标签: java arrays nio bytebuffer

我目前正在使用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?)

2 个答案:

答案 0 :(得分:2)

我认为您不需要 pos 变量。 put方法正在尝试在位置 pos 中读入event.getData(),而我认为您想要从位置0读取event.getData()。您只需使用{{ 1}}将数组的全部内容附加到缓冲区中。

答案 1 :(得分:0)

从你的问题来看,tuple_size对于event.getData()是否足够大是不明显的。 如果不是,那将导致您的IndexOutofBoundsException。 也许是一个人呢?

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

编辑:根据文档,如果缓冲区空间不足,则应该获得BufferOverflowException。 从文档中引用:

  

此方法将字节从给定源传输到此缓冲区   阵列。如果要从阵列复制的字节数多于剩余的字节数   在该缓冲区中,即,如果长度>剩余(),然后没有字节   转移并抛出BufferOverflowException。

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