【发布时间】: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