我们的应用程序中存在一个问题,可以简化为以下代码:
public static void main(String[] args) throws IOException, ClassNotFoundException {
File tempFile = File.createTempFile("teststream", "");
FileOutputStream fos = new FileOutputStream(tempFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(1);
oos.writeObject("foo");
oos.writeInt(2);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream(tempFile);
ObjectInputStream ois = new ObjectInputStream(fis);
int n1 = ois.readInt();
Object o1 = ois.readObject();
int n2 = ois.readInt();
}
此代码有效,但如果您评论以下行:
Object o1 = ois.readObject();
以下行
int n2 = ois.readInt();
会抛出一个EOFException
尽管我的文件中有数据,因为我在其中写了一个对象和一个整数。readInt的javadoc没有指出这种行为。我有点担心这一点EOFException
,因为我们想在我们的代码中区分真正的文件异常和错误类型的内容。
异常的堆栈跟踪是
Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:392)
at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2793)
at java.io.ObjectInputStream.readInt(ObjectInputStream.java:968)
这意味着以下代码DataInputStream
会引发异常:
public final int readInt() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();
但是in.read()
当输入流中有数据时不应该返回负数,所以我真的很感兴趣。
在我的代码中是否可以做一些事情来防止这种情况发生(知道我们可能会在某个时候调用readInd
where writeObject
was used)?
我正在使用这个版本的java:
java version "1.7.0_07"
OpenJDK Runtime Environment (IcedTea7 2.3.2) (ArchLinux build 7.u7_2.3.2-2-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)