Java ByteBuffer类

3

我正在从设备读取一个byte[],并尝试使用ByteBuffer类将其解释为Java中的整数数组,但是我得到了一个越界错误。请看这里:

byteBuffer.put(bytes); // put the array of bytes into the byteBuffer        

System.out.println("the value I want is " + byteBuffer.getInt(16*4)); // gives me the number I want, but I'd rather deal with an integer array like this:

System.out.println("the value I want is " + byteBuffer.asIntBuffer().get(16)); // index out of bounds? Why??

1
你能发布一个简短但完整的程序来演示这个问题吗? - Jon Skeet
我发现如果在调用byteBuffer.asIntBuffer()之前执行byteBuffer.position(0),它就能正常工作。虽然这样做有点奇怪,但确实有效。 - Barodapride
3
可能是因为 ByteBuffer 的位置被改变了。在 asIntBuffer 的 Javadoc 中:新缓冲区的内容将从该缓冲区的当前位置开始。对该缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。 - user1071777
1个回答

5
ByteBuffer类在内部存储了缓冲区的几个属性,其中最重要的是缓冲区中虚拟“光标”的位置。可以使用byteBuffer.position()读取此位置,并使用byteBuffer.position(123)进行写入。

ByteBuffer.asIntBuffer的JavaDoc现在说明如下:

新缓冲区的内容将从此缓冲区的当前位置开始。

这意味着,例如当您有一个容量为16个元素的ByteBuffer时,且该ByteBufferposition()为4,则生成的IntBuffer仅表示其余12个元素。

调用byteBuffer.put(bytes)后,字节缓冲区的位置会向前移动(取决于字节数组的长度)。然后创建的IntBuffer相应地具有较小的容量。

为解决此问题,可以在调用byteBuffer.put(bytes)之后调用byteBuffer.rewind()byteBuffer.position(0)。(哪个更适合取决于预期的使用模式)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接