Java 在视图缓冲区上添加浮点数组不会增加位置,这正常吗?

Java 在视图缓冲区上添加浮点数组不会增加位置,这正常吗?,java,bytebuffer,Java,Bytebuffer,如标题所示,此代码: ByteBuffer vertexBuffer = GLBuffers.newDirectByteBuffer(3*Float.BYTES+3*Byte.BYTES); System.out.println(vertexBuffer.toString()); vertexBuffer.asFloatBuffer().put(new float[]{1,2,3}); System.out.println(vertexBuffer.toStrin

如标题所示,此代码:

    ByteBuffer vertexBuffer = GLBuffers.newDirectByteBuffer(3*Float.BYTES+3*Byte.BYTES);
    System.out.println(vertexBuffer.toString());
    vertexBuffer.asFloatBuffer().put(new float[]{1,2,3});
    System.out.println(vertexBuffer.toString());
    vertexBuffer.put(new byte[]{0,1,2});
    System.out.println(vertexBuffer.toString());
打印出以下内容:

java.nio.DirectByteBuffer[pos=0 lim=15 cap=15]
java.nio.DirectByteBuffer[pos=0 lim=15 cap=15]
java.nio.DirectByteBuffer[pos=3 lim=15 cap=15]
但是,理论上,我希望视图缓冲区上的第一个
put
将位置从0增加到3,第二个
put
将位置从3增加到6,以便得到如下结果:

java.nio.DirectByteBuffer[pos=0 lim=15 cap=15]
java.nio.DirectByteBuffer[pos=3 lim=15 cap=15]
java.nio.DirectByteBuffer[pos=6 lim=15 cap=15]
api文件说:

公共最终FloatBuffer put(float[]src)相对批量put 方法(可选操作)。此方法传输整个内容 将给定源浮点数组的。援引 这种形式为dst.put(a)的方法的行为方式与 调用 dst.put(a,0,a.长度)

如果我们去看它提到的调用

公共FloatBuffer put(float[]src,int offset,int length)相对 批量输入方法(可选操作)。此方法传递浮点值 从给定的源数组导入此缓冲区。如果有更多的浮动 要从数组中复制,而不是保留在此缓冲区中,即,如果 长度>剩余() 引发BufferOverflowException。否则,此方法将复制 长度从给定数组浮动到此缓冲区,从 数组中的给定偏移量和此缓冲区的当前位置。 然后,此缓冲区的位置按长度递增。在其他情况下 words,调用此方法的形式为dst.put(src、off、len) 具有与循环完全相同的效果 for(int i=off;i 它清楚地表明这个职位将会增加

这是正常的还是我遗漏了什么

编辑:与以下对象的行为相同:

ByteBuffer vertexBuffer = ByteBuffer.allocate(3*Float.BYTES+3*Byte.BYTES);

是的,这没关系,因为实际上,
position
在另一个对象中增加了,这是调用
vertexBuffer.asFloatBuffer()
时得到的引用

换句话说,如果您将代码更改为:

    FloatBuffer floatBuffer = vertexBuffer.asFloatBuffer();
    floatBuffer.put(new float[]{1, 2, 3});
    System.out.println(floatBuffer.toString());
您将获得:

java.nio.ByteBufferAsFloatBufferB[pos=3 lim=3 cap=3]

是的,这没关系,因为实际上,
position
在另一个对象中增加了,这是调用
vertexBuffer.asFloatBuffer()
时得到的引用

换句话说,如果您将代码更改为:

    FloatBuffer floatBuffer = vertexBuffer.asFloatBuffer();
    floatBuffer.put(new float[]{1, 2, 3});
    System.out.println(floatBuffer.toString());
您将获得:

java.nio.ByteBufferAsFloatBufferB[pos=3 lim=3 cap=3]

这可能是
GLBuffers.newDirectByteBuffer
实现的一个特殊问题?它是什么?是分配缓冲区的
jogl
util,无论如何不是这样,让我更新这个问题视图缓冲区的Javadoc清楚地说明它们保持自己的位置和限制。是的,对不起,午休:),让我检查一下它可能是
GLBuffers的一个特殊问题。newDirectByteBuffer
实现?这是什么?这是分配缓冲区的
jogl
util,无论如何不是这样,让我更新这个问题视图缓冲区的Javadoc清楚地说明它们保持自己的位置和限制。是的,对不起,午休:),让我检查一下