首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将FloatBuffer转换为ByteBuffer

将FloatBuffer转换为ByteBuffer
EN

Stack Overflow用户
提问于 2014-12-15 20:02:25
回答 1查看 5.9K关注 0票数 8

ByteBuffer提供asFloatBuffer()功能。但是,没有等效的FloatBuffer.asByteBuffer()

我想做的是:

代码语言:javascript
复制
float[] array = ...
try( ByteChannel channel = Files.newByteChannel( path, WRITE, CREATE, TRUNCATE_EXISTING ) ) {
    channel.write (FloatBuffer.wrap (array) .asByteBuffer());
}

是否有一种有效地这样做的方法,或者我是否必须像以下所示那样分配一个ByteBuffer

代码语言:javascript
复制
ByteBuffer buffer = ByteBuffer.allocate( array.length * 4 );
buffer .asFloatBuffer() .put (array);
channel.write (buffer);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-21 20:29:31

对于HeapFloatBuffer (由FloatBuffer.allocateFloatBuffer.wrap创建),没有简单的解决方案。需要编写扩展ByteBuffer的自定义类。

对于HotSpot 8中的直接缓冲区,这将在简单的情况下起作用:

代码语言:javascript
复制
FloatBuffer floatBuffer = ByteBuffer.allocateDirect (...).asFloatBuffer();
ByteBuffer byteBuffer = (ByteBuffer) ((sun.nio.ch.DirectBuffer)floatBuffer).attachment();

对于其他情况,请使用以下方法。注意,这个类是在包java.nio中声明的。这也可能只适用于HotSpot 8。

代码语言:javascript
复制
package java.nio;

/**
 *
 * @author Aleksandr Dubinsky
 */
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());
        }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27492161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档