Java ByteBuffer类

时间:2014-09-24 16:49:33

标签: java bytebuffer

我正在从设备读取一个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 个答案:

答案 0 :(得分:4)

ByteBuffer类在内部存储缓冲区的几个属性。最重要的一个是缓冲区中的位置(虚拟“光标”)。可以使用byteBuffer.position()阅读此职位,并使用byteBuffer.position(123);撰写。

ByteBuffer.asIntBuffer的JavaDoc现在声明:

  

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

这意味着,例如,如果您的ByteBuffer容量为16个元素,并且此position()的{​​{1}}为4,那么结果为{{1} }将仅代表剩余的12个元素。

调用ByteBuffer后,字节缓冲区的位置会提前(取决于字节数组的长度)。因此,您正在创建的IntBuffer具有较小的容量。

要解决此问题,您可以在致电byteBuffer.put(bytes)后致电IntBufferbyteBuffer.rewind()。 (哪一个更合适取决于预期的使用模式)