【问题标题】:Reading integer values from binary file using Java使用Java从二进制文件中读取整数值
【发布时间】:2011-09-02 09:38:35
【问题描述】:

我正在尝试使用DataOupPutStream.write() 方法写入大于 256 的值。当我尝试使用 DataInputStream.read() 读取相同的值时,它将返回 0。因此,我使用 DataOutputStream.writeInt()DataInputStream.readInt() 方法来写入和检索大于 256 的值,它工作正常。

参考下面的代码 sn-p 我想知道编译器的行为,就像它在 while 语句中的 in.readInt() 中所做的那样。

FileOutputStream fout = new FileOutputStream("T.txt");
BufferedOutputStream buffOut = new BufferedOutputStream(fout);
DataOutputStream out = new DataOutputStream(fout);

Integer output = 0;
out.writeInt(257);
out.writeInt(2);
out.writeInt(2123);
out.writeInt(223);
out.writeInt(2132);
out.close();

FileInputStream fin = new FileInputStream("T.txt");
DataInputStream in = new DataInputStream(fin);

while ((output = in.readInt()) > 0) {
    System.out.println(output);
}

我运行这个 sn-p 时的输出是:

Exception in thread "main" java.io.EOFException
    at java.io.DataInputStream.readInt(Unknown Source)
    at compress.DataIOStream.main(DataIOStream.java:34)
257
2
2123
223
2132

但是当我在调试模式下运行时,我得到以下输出:

2123
223
2132
Exception in thread "main" java.io.EOFException
    at java.io.DataInputStream.readInt(Unknown Source)
    at compress.DataIOStream.main(DataIOStream.java:34)

【问题讨论】:

标签: java file-io binaryfiles java-io


【解决方案1】:

readInt() 方法和其他方法一样。您会收到 EOFException,因为这是 readInt() 的 Javadoc 所说的,当您到达文件末尾时会发生这种情况。


当我跑步时

DataOutputStream out = new DataOutputStream(new FileOutputStream("T.txt"));
out.writeInt(257);
out.writeInt(2);
out.writeInt(2123);
out.writeInt(223);
out.writeInt(2132);
out.close();

DataInputStream in = new DataInputStream(new FileInputStream("T.txt"));
try {
    while (true) 
        System.out.println(in.readInt());
} catch (EOFException ignored) {
    System.out.println("[EOF]");
}
in.close();

我在正常和调试模式下得到这个。

257
2
2123
223
2132
[EOF]

【讨论】:

  • 谢谢 Peter..EOFException 很好。但是调试模式和运行模式的结果不同。
  • 当您写入 System.out 和 System.err(写入异常时)时,输出的顺序不一致/始终相同。使用调试足以改变输出的顺序。
  • 是的。但在调试模式下读取的值也不同。假设如果我删除代码 sn-p 中的 while 子句并替换为 5 System.out.println(in.readInt());
  • @rozar,while 子句没有区别。很有可能调试是正确的,而您做错了什么。
  • @Peter,感谢您的回复,我非常感谢。除了EOFexception处理之外,你能在我上面的代码sn-p中找到任何错误吗?
猜你喜欢
  • 2015-07-27
  • 2018-01-16
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2021-07-26
  • 2011-07-25
相关资源
最近更新 更多