我正在尝试阅读一组结构化数据温度测量。数据以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;
}
答案 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循环,则该警告将消失。