Java字节缓冲类

Java字节缓冲类,java,bytebuffer,Java,Bytebuffer,我正在从一个设备读取一个字节[],并试图在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,

我正在从一个设备读取一个字节[],并试图在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??

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

现在的JavaDoc声明:

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

这意味着,例如,当您有一个容量为16个元素的
ByteBuffer
,并且该
ByteBuffer
position()
为4时,生成的
IntBuffer
将仅代表剩余的12个元素

调用
byteBuffer.put(bytes)
后,字节缓冲区的位置将提前(取决于字节数组的长度)。您正在创建的
IntBuffer
相应地具有较小的容量


要解决此问题,可以在调用
byteBuffer.put(字节)
后调用
byteBuffer.revind()
byteBuffer.position(0)
。(哪一个更合适取决于预期的使用模式)

你能发布一个简短但完整的程序来演示这个问题吗?我发现如果我在调用byteBuffer.asIntBuffer()之前执行byteBuffer.position(0),它会起作用。这样做似乎很奇怪,但它起作用了。可能是因为ByteBuffer的位置改变了。在javadoc for
asIntBuffer
:新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲器的位置、极限和标记值将是独立的。