Java从二进制文件读取

Java从二进制文件读取,java,windows,ubuntu,io,binary,Java,Windows,Ubuntu,Io,Binary,我有一些计算数据(浮点数和整数),它们被写入一个12mb的文件,如下所示 DataOutputStream os3; os3 = new DataOutputStream(new FileOutputStream(Cache.class.getResource("/3w.dat").getPath())); ...... (some loops) os3.writeFloat(f); os3.writeInt(r); os3.close(); 然后我就这样读了 DataIn

我有一些计算数据(浮点数和整数),它们被写入一个12mb的文件,如下所示

DataOutputStream os3;
os3 = new DataOutputStream(new FileOutputStream(Cache.class.getResource("/3w.dat").getPath()));
...... (some loops)
     os3.writeFloat(f);
     os3.writeInt(r);
os3.close();
然后我就这样读了

DataInputStream is3;
is3 = new DataInputStream(new FileInputStream(Cache.class.getResource("/3w.dat").getPath()));
...... (same loops)
     is3.readFloat();
     is3.readInt();
is3.close();
所以,我在Windows7上只写了一次文件。之后,我只在应用程序启动时阅读它。文件读取在Windows7上运行良好,但当我在Ubuntu上尝试读取时,会出现EOF异常(代码和文件相同)

我怀疑问题可能是由写入文件的某些NaN值引起的


顺便说一句,在调试时,我发现在ubuntu上,读取过程运行了大约15%的循环,并抛出了一个异常。它读取的所有值都是“0.0”,但文件不包含零。

问题应该是Linux和Windows之间的换行符不同。如Clark所述,只需将\n替换为\r\n,行尾字符即可解决此问题。您可以使用Notpad++简化这项工作。只需点击菜单:

编辑->下线转换->转换为UNIX格式

这可能也是一个编码问题。如果您使用的是Windows,默认编码是Windows-1252或所谓的CP-1252,这是专门针对microsoft的东西,在Linux上无法识别。只需将其更改为所有操作系统都能识别的UTF-8编码。使用Notpad++:

编码->转换为UTF-8


当你在Ubuntu上试用它时,这需要写和读还是仅仅读(也就是说,你读的是运行在Windows上的应用程序生成的文件)?我只是在Ubuntu上读的如果你在Ubuntu上读写,会发生什么情况?你可以尝试用\r\n替换,因为行尾字符与windows不同,它是一个二进制文件。没有\n或\r\n请使用UTF-8写入文件