从二进制文件中读取结构化数据的循环 - Java

时间:2015-02-11 06:51:59

标签: java

我正在尝试阅读一组结构化数据温度测量。数据以5个整数(然后转换为Date)和1个double(温度)的整数写入二进制(dat)文件。

我能够从第一个测量中读取,但是我想仅使用循环浏览其他测量。我知道它保存在文件中,因为我没有循环检查它。

我使用下面的代码得到StreamClosedException,这很清楚,但是JDK不允许我在循环之后放置close语句,而且我不知道如何执行此操作。非常感谢帮助。

public String readFile() {

    String s = "";
    int y, m, d, h, mm = 0;
    double p = 0;

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

        while (true) {
            y = dis.readInt();
            m = dis.readInt();
            d = dis.readInt();
            h = dis.readInt();
            mm = dis.readInt();
            temp = dis.readDouble();

            System.out.println("Measure from : " + y + "-" + m + "-" + d
                    + " " + h + ":" + mm + " ,temp: " + temp);
            dis.close();
        }

    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return s;
}

1 个答案:

答案 0 :(得分:1)

使用try, catch块时,您还可以使用finally

将调用此块,无论try是否成功结束,还是导致捕获的异常。在这个finally块中,你应该关闭所有流。

使用此方法,您还应该在块外声明所需的对象,然后从内部执行赋值。以下是使用dis的示例,您需要添加其他对象。

DataInputStream dis;

try{

    // other stream assignments
    dis = new DataInputStream(bis);
    // write data

...
} catch (IOException ex) {

    ex.printStackTrace();
} finally {

    // close other streams
    dis.close();
}

回到你的循环,有一个while(true)循环是不好的做法,而是使用一个能够在循环中改变的条件布尔

boolean run = true;

while(run){

    // do stuff
    if ( condition ) {
        run = false;
    }
}

如果您尝试在while循环之后添加dis.close(),并使用(true)硬编码,则编译器将发出警告,因为它知道它永远不会到达代码中的那一点。如果添加条件while循环,则该警告将消失。