IOException in ObjectInputStream in java

2019-09-04 09:10发布

I have problem with my code. I get IOException when I use readObject in my code. the whole program work correctly but when I want to use readObject I get this exception, this is the code I use for saving object:

        File f = new File("employees.obj");
    ObjectOutputStream objOut = null;

    try {

        objOut = new ObjectOutputStream(new BufferedOutputStream(
                new FileOutputStream(f)));
        objOut.writeObject(newEmployee);
        objOut.flush();

        System.out.println("Object is serialized.");

    } catch (FileNotFoundException e) {
        System.out.println("File not found!");

    } catch (IOException e) {
        System.out.println("Failed!");

    } finally {

        if (objOut != null) {
            try {

                objOut.close();
            } catch (IOException e) {
            }
        }
    }

and it is the code I use for restoring object:

    File f = new File("employees.obj");
    ObjectInputStream objIn = null;
    ArrayList<Employee> c = new ArrayList<Employee>();
    try {
        objIn = new ObjectInputStream(new BufferedInputStream(
                new FileInputStream(f)));
        while (objIn.readObject() != null) {
            Person employee = (Person) objIn.readObject();
            System.out.println("hello");
            System.out.println(employee.toString());
        }
        System.out.println(c.toString());
        return c;

    } catch (FileNotFoundException e) {
        System.out.println("1");
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        System.out.println("3");
    } catch (ClassCastException e) {
        System.out.println("4");
    } finally {

        if (objIn != null) {
            try {
                objIn.close();
            } catch (IOException e) {
                System.out.println("4");
            }
        }
    }
    return c;

and the result in console:

at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2553)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1296)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at org.bihe.DeSerializer.deSerializeEmployees(DeSerializer.java:20)
at org.bihe.Main.enterAsManager(Main.java:238)
at org.bihe.Main.menu(Main.java:92)
at org.bihe.Main.main(Main.java:50)

3条回答
狗以群分
2楼-- · 2019-09-04 09:34

You already read the object in the while loop test.

    while (objIn.readObject() != null) {
        Person employee = (Person) objIn.readObject();
        System.out.println("hello");
        System.out.println(employee.toString());
    }

Change it to:

    for (Person employee = (Person) objIn.readObject(); employee != null; Person employee = (Person) objIn.readObject()) {
        System.out.println("hello");
        System.out.println(employee.toString());
    }
查看更多
smile是对你的礼貌
3楼-- · 2019-09-04 09:39

In addition to the underlying problem of reading twice, you have another problem. EOFException just means you've reached the end of the stream. Catch it, and break out of the loop. At present your code incorrectly assumes that readObject() returns null at end of stream. It doesn't. It returns null if you wrote a null, which can happen any time, or never, depending entirely in what you wrote to the stream.

查看更多
Animai°情兽
4楼-- · 2019-09-04 09:46
    while (objIn.readObject() != null) {

will deseralize one object (Person). Then the next line:

        Person employee = (Person) objIn.readObject();

attempts to deseralize the next object. If you're at the end of the file (EOF), then it throws IOException.

To fix this do something like this:

    Person employee;
    while ((employee = (Person)objIn.readObject()) != null) {
        System.out.println("hello");
        System.out.println(employee.toString());
    }

The while compares readObject() with null and assigns it to employee.

查看更多
登录 后发表回答