Search code examples
javaobjectarraylistiostream

Using ObjectInputStream to store Objects in an ArrayList


I want to take the "computer" objects from the "computers.dat" file and put them into an ArrayList, then call the computer.toString() method to display them.

Here is my code:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class ReadComputers {

public static void main(String[] args) throws ClassNotFoundException, IOException {

    FileInputStream fis = new FileInputStream("computers.dat");
    ObjectInputStream ois = new ObjectInputStream(fis);

    ArrayList <Computer> comp;
    comp = (ArrayList <Computer>)ois.readObject(); 


  for (int i = 0; i < comp.size(); i++) {
      String computer = comp.get(i).toString();
      System.out.println(computer);
  }
    ois.close();
 }
}

For the record, the computer class has implemented the Serializable interface, in case you were wondering if that was the problem

When I run the program I get these errors:

Exception in thread "main" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: thibodeau17.Computer
    at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
    at java.base/java.util.ArrayList.readObject(Unknown Source)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
    at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
    at thibodeau17.ReadComputers.main(ReadComputers.java:19)
Caused by: java.io.NotSerializableException: thibodeau17.Computer
    at java.base/java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.base/java.io.ObjectOutputStream.writeObject(Unknown Source)
    at java.base/java.util.ArrayList.writeObject(Unknown Source)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at java.base/java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    at java.base/java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.base/java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.base/java.io.ObjectOutputStream.writeObject(Unknown Source)
    at thibodeau17.StoreComputers.main(StoreComputers.java:23)

Solution

  • Here is how I got it to work:

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.util.ArrayList;
    
    public class ReadComputers {
    
    
        public static void main(String[] args) throws ClassNotFoundException, IOException {
    
    try{
    
                FileInputStream fis = new FileInputStream("computers.dat");
                ObjectInputStream ois = new ObjectInputStream(fis);
                Object obj = ois.readObject();
                ArrayList<Computer> computers = (ArrayList<Computer>) obj;
    
                for (Computer c : computers) {
                    System.out.println(c.toString());
                    System.out.println();
                }
            }
            catch (FileNotFoundException e){
    
                e.printStackTrace();
            }
            catch (IOException e){
    
                e.printStackTrace();
            }
            catch (ClassNotFoundException e){
    
                e.printStackTrace();
            }
    
        }
    }
    

    I borrowed code from a couple different sources around the web and my textbook, but to anyone who was curious for an answer here it is. Thank you to all that helped.