De-serializing objects from a file in Java

22,876

Solution 1

Try the following:

List<Object> results = new ArrayList<Object>();
FileInputStream fis = new FileInputStream("cool_file.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);

try {
    while (true) {
        results.add(ois.readObject());
    }
} catch (OptionalDataException e) {
    if (!e.eof) 
        throw e;
} finally {
    ois.close();
}

Following up on Tom's brilliant comment, the solution for multiple ObjectOutputStreams would be,

public static final String FILENAME = "cool_file.tmp";

public static void main(String[] args) throws IOException, ClassNotFoundException {
    String test = "This will work if the objects were written with a single ObjectOutputStream. " +
            "If several ObjectOutputStreams were used to write to the same file in succession, " +
            "it will not. – Tom Anderson 4 mins ago";

    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(FILENAME);
        for (String s : test.split("\\s+")) {
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(s);
        }
    } finally {
        if (fos != null)
            fos.close();
    }

    List<Object> results = new ArrayList<Object>();

    FileInputStream fis = null;
    try {
        fis = new FileInputStream(FILENAME);
        while (true) {
            ObjectInputStream ois = new ObjectInputStream(fis);
            results.add(ois.readObject());
        }
    } catch (EOFException ignored) {
        // as expected
    } finally {
        if (fis != null)
            fis.close();
    }
    System.out.println("results = " + results);
}

Solution 2

You can't append ObjectOutputStreams to a file. They contain headers as well as the objects you wrote. Revise your technique.

Also your EOF detection is wrong. You should catch EOFException separately. OptionalDataException means something different entirely.

Share:
22,876
topgun_ivard
Author by

topgun_ivard

Learning is always an upward curve!

Updated on September 20, 2020

Comments

  • topgun_ivard
    topgun_ivard over 3 years

    I have a file which contains multiple serialized objects of class XYZ. While serializing, the each XYZ object was appended to the file.

    Now I need to read each object from the file, and I am able to read only the first object.

    Any idea how I can read each object from the file and eventually store it into a List?

  • Tom Anderson
    Tom Anderson over 12 years
    This will work if the objects were written with a single ObjectOutputStream. If several ObjectOutputStreams were used to write to the same file in succession, it will not.
  • alf
    alf over 12 years
    @TomAnderson so true... Well, fixed.
  • Tom Anderson
    Tom Anderson over 12 years
    We don't actually know that the objects were written separately yet. Your first answer might be perfectly correct!
  • aalosious
    aalosious over 8 years
    I don't know if something has changed in the last 4 years, but it worked for me when I tried with several ObjectOutputStreams. Every time I wrote to the file, I made sure I was appending, like : fos = new FileOutputStream(FILENAME, true);