簡體   English   中英

從二進制文件讀取結構化數據的循環-Java

[英]Reading loop of structured data from binary file - Java

我正在嘗試閱讀一組結構化數據溫度度量。 數據以5個整數(然后轉換為Date)和1個double(溫度)的集合形式寫入二進制(dat)文件。

我可以從第一個度量中讀取內容,但是我想僅使用循環來瀏覽其他度量。 我知道它已保存在文件中,因為我沒有循環檢查它。

我得到StreamClosedException帶有以下代碼的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;
}

當使用try, catch塊時,也可以使用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循環之后添加帶有硬編碼(true)的dis.close() ,則編譯器將發出警告,因為它知道該代碼永遠都不會到達該點。 如果添加條件while循環,該警告將消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM