使用Java从二进制文件中读取整数值

4
我正在尝试使用DataOupPutStream.write()方法写入大于256的值。当我尝试使用DataInputStream.read()读取相同的值时,它会返回0。因此,我使用了DataOutputStream.writeInt()DataInputStream.readInt()方法来写入和检索大于256的值,并且运行良好。
请参考下面的代码片段,我想知道编译器在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);
}

我运行这段代码后的输出结果是:
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)

http://download.oracle.com/javase/6/docs/api/java/io/DataInputStream.html#readInt%28%29 - Prince John Wesley
1个回答

8

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没问题。但是在调试模式和运行模式下结果不同。 - rozar
1
当您写入 System.out 和 System.err(在写入异常时)时,输出的顺序不一致/总是不同的。使用调试就足以改变输出的顺序。 - Peter Lawrey
是的..但在调试模式下读取的值也不同。假设我从代码片段中删除while子句并替换为5 System.out.println(in.readInt()); - rozar
@rozar,while子句没有任何影响。更有可能的是调试正确,而你做错了什么。 - Peter Lawrey
@Peter,感谢您的回复,我非常感激。除了EOFexception处理之外,您能否在上面的代码片段中找到任何错误? - rozar
@rozar,我已经向您展示了我如何编写它。您的buffOut没有被使用,而且您的while循环正在等待从未发生的事情,因此我简化了您的示例。您应该像我一样捕获EOFException。如果文件更大,我会使用BufferedInputStream和BufferedOutputStream。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接