我有一个500MB的二进制文件。有一堆浮动条目。它是由C ++程序编写的。我会像这样用C ++加载它。
void load(char f_name[], int size, float data[])
{
std::fstream f_bin(f_name, std::ios::in|std::ios::binary);
f_bin.seekg(std::ios::beg);
f_bin.read((char*)data, size*sizeof(float));
f_bin.close();
}
float *data;
int size = 123456789;
data = new float[size];
load("myFile.bin", size, data);
我可以访问浮点值:data [x];在c ++中,它可以快速运行。 java中有类似的东西吗?
修改 看了一下我到目前为止有这个:
RandomAccessFile f = new RandomAccessFile("C://path//myFile.bin", "r");
byte[] bytes = new byte[(int)f.length()];
f.read(bytes);
float fl = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getFloat();
System.out.println(fl);
打印第一个浮点条目。现在我应该通过float循环浮动并将其放在像float[] data
这样的数组中。
答案 0 :(得分:3)
你可以用Java做到这一点。
try(FileChannel fc = new RandomAccessFile("myFile.bin", "rw").getChannel()) {
FloatBuffer fb = fc.map(MapMode.READ_WRITE, 0, fc.size())
.order(ByteOrder.nativeOrder()).asFloatBuffer();
// use fb
}
由于内存映射文件并避免内存复制(在C ++中也可以这样做),因此速度要快得多。
答案 1 :(得分:0)
Java标准非常准确地表示浮点的表示方式:
Java virtual machine specification 2.3.2:浮点类型是float和double,它们在概念上与 32位单精度和64位双精度格式IEEE 754 IEEE标准二进制文件中规定的值和操作 浮点运算(ANSI / IEEE标准754-1985,纽约)。
但是C ++标准并没有给出很多保证:
C ++ 11标准3.9.1 / 8:有三种浮点类型:float,double和long double。 double类型提供的精度至少与 float,long double类型提供的精度至少与 双。 (...)浮点类型的值表示是 的实现定义强>
使用<limits>
,您可以通过便携方式了解有关浮动的更多信息:std::numeric_limits<float>::is_iec559
将告诉您是否符合IEC-559 / IEEE-754标准(也称为java) )用于: