我正在尝试从二进制.dat文件中读取日期(一组6个整数)和温度(双精度)。
经过多次尝试后,我终于到了文件工作的阶段,但它以我无法识别的格式返回int。例如。日期2017-03-02 11:33,温度3.8读作:
措施:515840-1024-1024 2816 8512 241591910 温度:1.9034657819129845E185
任何想法,如何更改代码?
public void readFile() {
try {
DataInputStream dis = null;
BufferedInputStream bis = null;
try {
FileInputStream fis = new FileInputStream(fileLocation);
int b;
bis = new BufferedInputStream(fis);
dis = new DataInputStream(fis);
while ((b = dis.read()) != -1) {
System.out.println("Measure : " + dis.readInt() + "-"
+ dis.readInt() + "-" + dis.readInt() + " " +
dis.readInt() + " " + dis.readInt() + " "
+ dis.readInt() + " Temperature: "+ dis.readDouble());
}
} finally {
dis.close();
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (EOFException f) {
f.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} // readFile
答案 0 :(得分:3)
while ((b = dis.read()) != -1) {
问题出在这里。这会在每次迭代时读取并丢弃文件的一个字节,因此所有后续读取都不同步。
使用DataInputStream
或ObjectInputStream
循环的正确方法是使用while (true)
循环,并在read()
返回-1时终止,readLine()
返回null
或readXXX()
用于任何其他X投掷EOFException.
请注意,您通常不需要在EOFException
上记录或打印堆栈跟踪,因为它是正常的循环终止条件... 除非您有理由期待更多数据,例如您的文件以尚未到达的记录计数开始,这可能表示该文件已被截断,因此已损坏。