带有readObject的Java神秘EOF异常

时间:2011-03-07 09:27:28

标签: java exception serialization eofexception

以下代码生成EOFException。那是为什么?

public static Info readInfoDataFromFile(Context context) {
    Info InfoData = null;
    FileInputStream fis = null;
    ObjectInputStream ois = null;
    Object object = null;

    if (context.getFileStreamPath("InfoFile.dat").exists()) {
        try {
            fis = context.openFileInput("InfoFile.dat");
            ois = new ObjectInputStream(fis);
            Object temp;
            try {
                // here it throws EOF exception in while loop 
                while ((temp = ois.readObject()) != null) {
                    object = temp;
                }
            } catch (NullPointerException npe) {
                npe.printStackTrace();
            } catch (EOFException eof) {
                eof.printStackTrace();
            } catch (FileNotFoundException fnfe) {
                fnfe.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (ois != null) {
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

堆栈跟踪:

03-07 14:29:01.996: WARN/System.err(13984): java.io.EOFException
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.DataInputStream.readByte(DataInputStream.java:131)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:628)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:907)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2262)03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2217)
03-07 14:29:01.996: WARN/System.err(13984):     at 

5 个答案:

答案 0 :(得分:9)

取决于您的文件包含多少个对象。如果它只有一个对象,则可以一步反序列化。

try {
    Object temp = ois.readObject();
}
catch(Exception e) {
    //handle it
}

答案 1 :(得分:7)

首先,如果您在创建流时向流写入readObject()null仅返回null。如果流中没有更多数据,则会抛出EOFException

如果您不期望EOF,原因可能是流已损坏。如果您在向其写入数据后忘记关闭它,就会发生这种情况。

答案 2 :(得分:5)

我有同样神秘的EOFException,只有对象类的路径才能通过ObjectOutputStream发送到ObjectInputStream。它们必须具有相同的路径(相同的包名称,当然还有相同的类名)。

答案 3 :(得分:2)

readObject()ObjectInputStream的定义并未指定在到达流末尾时它将返回null。相反,如果您尝试读取超出文件末尾的其他对象,则抛出异常。

答案 4 :(得分:0)

我收到此错误,是因为使用OutputStream.write()编写了int,而使用InputStream.readInt()读取了

但是,OutputStream.write根据文档编写了 byte (put接受int作为参数),因此,我需要使用{{ 1}}。