从二进制文件Java中错误地读取int

时间:2015-02-11 23:06:00

标签: java

我正在尝试从二进制.dat文件中读取日期(一组6个整数)和温度(双精度)。

经过多次尝试后,我终于到了文件工作的阶段,但它以我无法识别的格式返回int。例如。日期2017-03-02 11:33,温度3.8读作:

措施:515840-1024-1024 2816 8512 241591910 温度:1.9034657819129845E185

任何想法,如何更改代码?

public void readFile() {

                try {
                    DataInputStream dis = null;
                    BufferedInputStream bis = null;
                    try {
                        FileInputStream fis = new FileInputStream(fileLocation);

                        int b;
                        bis = new BufferedInputStream(fis);
                        dis = new DataInputStream(fis);

                        while ((b = dis.read()) != -1) {

    System.out.println("Measure : " + dis.readInt() + "-" 
    + dis.readInt() + "-" + dis.readInt() + " " + 
    dis.readInt() + " " + dis.readInt() + " "
    + dis.readInt() + " Temperature: "+ dis.readDouble());

                        }
                    } finally {
                        dis.close();
                    }
                } catch (FileNotFoundException ex) {
                    ex.printStackTrace();
                } catch (EOFException f) {
                    f.printStackTrace(); 
                } catch (IOException e) {
                    e.printStackTrace();
                }

            } // readFile   

1 个答案:

答案 0 :(得分:3)

while ((b = dis.read()) != -1) {

问题出在这里。这会在每次迭代时读取并丢弃文件的一个字节,因此所有后续读取都不同步。

使用DataInputStreamObjectInputStream循环的正确方法是使用while (true)循环,并在read()返回-1时终止,readLine()返回nullreadXXX()用于任何其他X投掷EOFException.

请注意,您通常不需要在EOFException上记录或打印堆栈跟踪,因为它是正常的循环终止条件... 除非您有理由期待更多数据,例如您的文件以尚未到达的记录计数开始,这可能表示该文件已被截断,因此已损坏。