2015-02-11 105 views
0

我試圖讀取一組結構化數據溫度測量。數據以5個整數(然後轉換爲日期)和1個雙精度(溫度)的集合寫入二進制(dat)文件。從二進制文件讀取結構化數據的循環 - Java

我能夠從第一個度量中讀取,但是我想通過使用循環來瀏覽其他度量。我知道它保存在文件中,因爲我沒有循環檢查它。

我得到StreamClosedException與下面的代碼,這是清楚的,但JDK不允許我放置循環後關閉聲明,我沒有另一個想法如何做到這一點。將感謝幫助。

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; 
} 
+0

我假設你想要*停止*閱讀,當你到達文件的結尾,對吧?你的代碼(刪除close)試圖永遠保持閱讀。 – immibis 2015-02-11 07:14:20

回答

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循環,則該警告將消失。

+0

非常感謝。這很有用,但仍然不適合我。我想我錯過了我可以使用的病症類型。 dis「.hasNext byte or sth」,但是我在dis對象中找不到這種類型的方法... – Turo 2015-02-11 08:31:49