【问题标题】:write/read float array in java fast way以java快速方式写入/读取浮点数组
【发布时间】:2014-03-07 11:57:52
【问题描述】:

我正在尝试使用 java 代码在 android 设备中写入和读取浮点数组(实际上相当大,640*480)。 喜欢this one

    DataOutputStream out = ...;
for (int i=0; i<floatarray.length; ++i)
    out.writeFloat(floatarray[i]);

很慢,我已经尝试过了。

写:

            float[] test=new float[3];
        test[0]=1.0f;
        test[1]=1.2f;
        test[2]=1.5f;
        //long timeBeforeWrite = System.nanoTime();
        try {
            BufferedOutputStream  dataOut = new BufferedOutputStream (
                    new FileOutputStream("/sdcard/DCIM/Camera/Dual/demo.bin"));

            byte buf[]=new byte[4*test.length];

            long timeBeforeWrite = System.nanoTime();

            for (int i=0; i<test.length; ++i)
            {
                int val = Float.floatToRawIntBits(test[i]);
                buf[4 * i] = (byte) (val >> 24);
                buf[4 * i + 1] = (byte) (val >> 16) ;
                buf[4 * i + 2] = (byte) (val >> 8);
                buf[4 * i + 3] = (byte) (val);
            }



            dataOut.write(buf);

            long ct_write = System.nanoTime();
            long offset_write = ct_write - timeBeforeWrite;
            float mOffsetInMs_write = (float)(offset_write)/1000000;
            Log.e("ETA", "write float[]  " + Float.toString(mOffsetInMs_write));

            dataOut.flush();
            dataOut.close();
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }

阅读:

            float[] read=new float[3];

        try{
            BufferedInputStream  dataIn=new BufferedInputStream (new FileInputStream("/sdcard/DCIM/Camera/Dual/demo.txt"));
            byte buf[]=new byte[4*read.length];
            long timeBeforeWrite = System.nanoTime();

            dataIn.read(buf);

            for (int i=0; i<read.length; ++i)
            {
                    int val;
val = buf[4 * i] << 24;
                    val += buf[4 * i + 1] << 16;
                    val += buf[4 * i + 2] << 8;
                    val += buf[4 * i + 3];

                read[i]=Float.valueOf(Integer.toBinaryString(val));

                //int val = Float.floatToRawIntBits(disparityMap[i]);

            }

            long ct_write = System.nanoTime();
            long offset_write = ct_write - timeBeforeWrite;
            float mOffsetInMs_write = (float)(offset_write)/1000000;
            Log.e("ETA", "read float[]  " + Float.toString(mOffsetInMs_write));

            dataIn.close();

        }catch (IOException ex) {
            System.err.println(ex.getMessage());
        }

回读的东西是非常奇怪的浮点值,这有什么问题?顺便说一句,回读运行很慢,不知道为什么。 或者任何其他快速读/写浮点数组的好主意?

谢谢!

//感谢拉里,我尝试了 bytebuffer.asfloatbuffer() 方法,例如:

//WRITE
    float[] test = new float[3];
    test[0]=1.1f;
    test[1]=1.2f;
    test[2]=1.5f;
    try{
        RandomAccessFile aFile = new RandomAccessFile("/sdcard/demo.data", "rw");
        FileChannel outChannel = aFile.getChannel();

        //one float 3 bytes
        ByteBuffer buf = ByteBuffer.allocate(12);
        buf.clear();
        buf.asFloatBuffer().put(test);

        //while(buf.hasRemaining()) 
        {
            outChannel.write(buf);
        }

        outChannel.close();

    }
    catch (IOException ex) {
        System.err.println(ex.getMessage());
    }

    //READ
    float[] readback=new float[3];
    try{


        RandomAccessFile rFile = new RandomAccessFile("/sdcard/demo.data", "rw");
        FileChannel inChannel = rFile.getChannel();
        ByteBuffer buf_in = ByteBuffer.allocate(12);
        buf_in.clear();

        inChannel.read(buf_in);

        buf_in.asFloatBuffer().get(readback);

        inChannel.close();

    }
    catch (IOException ex) {
        System.err.println(ex.getMessage());
    }

程序在buf_in.asFloatBuffer().get(readback); 中崩溃 任何想法,是否有很好的方法可以在 java 中进入和调试,抱歉在 java 世界中是全新的。再次感谢

【问题讨论】:

  • 我和你有同样的问题... "buf_in.asFloatBuffer().get(readback);"崩溃...您解决了问题吗?
  • 这里缺少的问题是缓冲区的位置不对。您需要在其上调用 position(0)。

标签: java android arrays io floating-point


【解决方案1】:

感谢拉里,我只是分享我的代码,希望它可以帮助其他人。

我只是想通了,我们需要在读/写文件通道后回退到缓冲区。以下代码可以正常工作,并且运行速度非常快。

float[] disparity=new float[640*480];

    disparity[1]=1.5f;
    disparity[2]=4.566f;

//WRITE
    try{
        RandomAccessFile aFile = new RandomAccessFile("/sdcard/demo.data", "rw");
        FileChannel outChannel = aFile.getChannel();

        //one float 4 bytes
        ByteBuffer buf = ByteBuffer.allocate(4*640*480);
        buf.clear();
        buf.asFloatBuffer().put(disparity);

        //while(buf.hasRemaining()) 
        {
            outChannel.write(buf);
        }

        //outChannel.close();
        buf.rewind();

        float[] out=new float[3];
        buf.asFloatBuffer().get(out);

        outChannel.close();

    }
    catch (IOException ex) {
        System.err.println(ex.getMessage());
    }

    //READ
    float[] readback=new float[640*480];
    try{

        RandomAccessFile rFile = new RandomAccessFile("/sdcard/demo.data", "rw");
        FileChannel inChannel = rFile.getChannel();
        ByteBuffer buf_in = ByteBuffer.allocate(640*480*4);
        buf_in.clear();

        inChannel.read(buf_in);

        buf_in.rewind();
        buf_in.asFloatBuffer().get(readback);

        inChannel.close();

    }
    catch (IOException ex) {
        System.err.println(ex.getMessage());
    }

再次感谢。

【讨论】:

  • 您必须在finally 块中关闭文件或使用try-with-resources!您在读取期间倒带是正确的,但在写入期间却不是。我建议你这样做:try (ByteChannel channel = Files.newByteChannel( path, WRITE, CREATE, TRUNCATE_EXISTING )) { ByteBuffer buf = ByteBuffer.allocate(disparity.length * 4); buf.asFloatBuffer().put(disparity); channel.write (buf); }
【解决方案2】:

尝试使用FileChannel 访问文件,使用ByteBuffer 访问数据。您可以使用ByteBuffer.putFloat() 方法将数据放入ByteBuffer,并使用FileChannel.write() 将其写出。当你读回来的时候,你可以调用FileChannel.read()得到一个代表数据的ByteBuffer,然后调用ByteBuffer.asFloatBuffer()得到一个代表数据的FloatBuffer,然后可以用它来得到一个float[]

【讨论】:

  • 非常感谢,我已经更新了我的问题,回读在 buf_in.asFloatBuffer().get(readback) 中不起作用;对此有何想法?
【解决方案3】:

只需在 DataOutputStream 和 FileOutputStream 之间添加一个 BufferedOutputStream。

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2017-08-01
    • 2021-04-06
    • 2019-11-28
    相关资源
    最近更新 更多