本文介绍了读/写int数组在java中快速的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图读写float数组(pretty实际上大,640 * 480)在用java codeS Android设备。

I am trying to write and read float array(pretty large actually, 640*480) in android devices with java codes.like this one

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

是很慢的,我有尝试在此。

is very slow and I have try it in this.

写:

            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());
        }

READ:

            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());
        }

东西读回是pretty奇怪的浮点值,有什么错呢?顺便说一句,读回运行pretty慢,不知道为什么。
 或用于快速读/写float数组任何其他好主意吗?

things read back is pretty strange floating point values, and what's wrong with this?BTW, read back runs pretty slow, don't know why. Or any other good idea for fast read/write float array?

谢谢!

//感谢拉里,我已经尝试bytebuffer.asfloatbuffer()之类的方式:

//Thanks to Larry, I have try bytebuffer.asfloatbuffer() ways like:

//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()获得(回读);
任何想法,是有货的方式进入并调试里面在java中,在对不起Java世界全新的。再次感谢

and the program crashes in buf_in.asFloatBuffer().get(readback);any idea and is there goods ways to goes in and debug inside in java, Sorry completely new in java world. Thanks again

推荐答案

尝试使用 FileChannel 为您的文件访问和的ByteBuffer 用于数据。你可以把数据放入的ByteBuffer 使用 ByteBuffer.putFloat()方法,并将其与<$ C写出来$ C> FileChannel.write()。当你读回,你可以调用 FileChannel.read()来获得的ByteBuffer重新presenting数据,然后调用 ByteBuffer.asFloatBuffer ()获得 FloatBuffer 重新presenting数据然后可以用来获得浮法[]

Try using FileChannel for your file access and a ByteBuffer for the data. You can put the data into the ByteBuffer using the ByteBuffer.putFloat() methods and write it out with FileChannel.write(). When you read it back, you can call FileChannel.read() to get a ByteBuffer representing the data, then call ByteBuffer.asFloatBuffer() to get a FloatBuffer representing the data which can then be used to get a float[].

这篇关于读/写int数组在java中快速的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-17 20:55