Java Таинственное исключение EOF с readObject - PullRequest
10 голосов
/ 07 марта 2011

Следующий код выдает 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();
            }
        }

StackTrace:

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 

Ответы [ 4 ]

9 голосов
/ 07 марта 2011

Зависит от того, сколько объектов содержит ваш файл.Если у него есть только один объект, вы можете десериализовать за один шаг.

try {
    Object temp = ois.readObject();
}
catch(Exception e) {
    //handle it
}
7 голосов
/ 07 марта 2011

Прежде всего, readObject() возвращает null, только если вы написали null в поток при его создании. Если в потоке больше нет данных, он выдаст EOFException.

Если вы не ожидаете EOF, возможно, причина в том, что поток поврежден. Это может произойти, если вы забудете закрыть его после записи в него данных.

5 голосов
/ 18 апреля 2013

У меня была та же таинственная EOFException, и отправлять через ObjectOutputStream к ObjectInputStream был только путь класса объектов. Они должны иметь одинаковый путь (одно и то же имя пакета и, конечно, одно и то же имя класса).

2 голосов
/ 07 марта 2011

Определение readObject() для ObjectInputStream не указывает, что оно вернет null, когда будет достигнут конец потока. Вместо этого выдается исключение, если вы пытаетесь прочитать дополнительный объект за концом файла.

...