有没有人对如何使用java或clojure从二进制文件中读取浮点值有任何建议?我正在将我当前的值与Python的NumPy nump.fromfile('path', dtype="f")
方法的结果进行比较,而我根本得不到相同的答案。我怀疑这是因为Java的DataInputStream.readFloat()
方法假定二进制文件是由java编写的,this documentation显示:
读取四个输入字节并返回a 浮动值。它首先是这样做的 完全构造一个int值 然后是readInt方法的方式 将此int值转换为float 完全按照方法的方式 Float.intBitsToFloat。这个方法是 适合读取写入的字节 接口的writeFloat方法 DataOutput中。
所以,我认为java正在向后读取浮点值。前12个字节是:
(0 -64 121 -60 0 -64 121 -60 0 -64 121 -60)
Clojure / java将此视为重复1.7676097E-38
,而NumPy和Python将其视为重复-999.0
。作为参考,我正在使用this dataset。
答案 0 :(得分:6)
Java在java.io中使用“网络顺序”(big endian)。但是,java.nio允许您选择要应用的字节顺序:
user=> (-> (map byte [0 -64 121 -60]) byte-array java.nio.ByteBuffer/wrap
(.order java.nio.ByteOrder/LITTLE_ENDIAN) .getFloat)
-999.0
下一步是要么以字节数组的形式读取整个文件,要么从FileChannel
创建FileInputStream
,然后对其进行mmap并从生成的mmaped ByteBuffer
中读取使用.getFloat
。
答案 1 :(得分:0)
您可以将文件读取为字节,更改字节序,将这些字节写入内存中的流,然后再次使用DataInputStream以浮点形式读取它们。
答案 2 :(得分:0)
看起来该数据集以netCDF格式提供。 python + numpy和java都有netCDF库。这些库几乎可以解决所有可移植性问题,并且可能对性能没有太大影响。
将数字保存到文件几乎是一个解决的问题。你不应该在字面意义重要的层面上工作,除非你这样做是为了好玩。