对于
HeapFloatBuffer,即由
FloatBuffer.allocate或创建
FloatBuffer.wrap,没有简单的解决方案。需要编写一个扩展ByteBuffer的自定义类。
对于HotSpot 8中的直接缓冲区,这在普通情况下将起作用:
FloatBuffer floatBuffer = ByteBuffer.allocateDirect (...).asFloatBuffer();ByteBuffer byteBuffer = (ByteBuffer) ((sun.nio.ch.DirectBuffer)floatBuffer).attachment();
对于其他情况,请使用以下内容。请注意,此类在package中声明
java.nio。这也可能仅适用于HotSpot 8。
package java.nio;public class BufferUtils { public static ByteBuffer asByteBuffer (FloatBuffer floatBuffer) { if (floatBuffer instanceof DirectFloatBufferU) { DirectFloatBufferU buffer = (DirectFloatBufferU) floatBuffer; return (ByteBuffer) new DirectByteBuffer (buffer.address(), floatBuffer.capacity() * Float.BYTES, buffer).position (floatBuffer.position() * Float.BYTES).limit (floatBuffer.limit() * Float.BYTES); } else if (floatBuffer instanceof DirectFloatBufferS) { DirectFloatBufferS buffer = (DirectFloatBufferS) floatBuffer; return (ByteBuffer) new DirectByteBuffer (buffer.address(), floatBuffer.capacity() * Float.BYTES, buffer).position (floatBuffer.position() * Float.BYTES).limit (floatBuffer.limit() * Float.BYTES); } else if (floatBuffer instanceof ByteBufferAsFloatBufferB) { ByteBufferAsFloatBufferB buffer = (ByteBufferAsFloatBufferB)floatBuffer; return (ByteBuffer) ((ByteBuffer) buffer.bb .duplicate() .position (buffer.offset) .limit (buffer.offset + buffer.capacity() * Float.BYTES)) .slice() .position (buffer.position() * Float.SIZE) .limit (buffer.limit() * Float.BYTES); } else if (floatBuffer instanceof ByteBufferAsFloatBufferL) { ByteBufferAsFloatBufferL buffer = (ByteBufferAsFloatBufferL)floatBuffer; return (ByteBuffer) ((ByteBuffer) buffer.bb .duplicate() .position (buffer.offset) .limit (buffer.offset + buffer.capacity() * Float.BYTES)) .slice() .position (buffer.position() * Float.SIZE) .limit (buffer.limit() * Float.BYTES); } else throw new IllegalArgumentException ("Unsupported implementing class " + floatBuffer.getClass().getName()); }}


