2015-02-11 108 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