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 に設定されています。私の問題は、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 に保ちながら?)

4

2 に答える 2

2

pos変数は必要ないと思います。メソッドはposの位置putに読み込もうとしていますが、位置 0から読みたいと思います。配列の内容全体をバッファに追加するだけです。event.getData()event.getData()batch.put(event.getData())

于 2012-08-24T12:02:14.460 に答える
0

tuple_size が event.getData() に十分な大きさであるかどうかは、質問から明らかではありません。そうでない場合は、IndexOutofBoundsException が発生します。もしかして一つずれてる?

もう 1 つの可能性は、イテレータitに要素が 1 つしか含まれていないことです。

編集: ドキュメントによると、バッファーの容量が不足した場合は BufferOverflowException を取得する必要があります。ドキュメントからの引用:

このメソッドは、指定されたソース配列からこのバッファーにバイトを転送します。配列からコピーするバイト数がこのバッファーに残っているバイト数よりも多い場合 (つまり、length > left() の場合)、バイトは転送されず、BufferOverflowException がスローされます。

これは、問題が予期したものではないことを示しています。

于 2012-08-24T11:50:58.453 に答える