File Input Output Java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Engine implements Serializable {
  private int numCylinders;
  Engine(int numCylinders) {
    this.numCylinders = numCylinders;
  }
  int getNumCylinders() {
    return numCylinders;
  }
}
class Car implements Serializable {
  private int numTires;
  private Engine e;
  private String name;
  Car(String name, int numTires, Engine e) {
    this.name = name;
    this.numTires = numTires;
    this.e = e;
  }
  int getNumTires() {
    return numTires;
  }
  Engine getEngine() {
    return e;
  }
  String getName() {
    return name;
  }
}
class Main {
  public static void main(String[] args) throws Exception {
    Car c1 = new Car("Some car", 4, new Engine(6));
    ObjectOutputStream oos = null;
    FileOutputStream fos = new FileOutputStream("car.ser");
    oos = new ObjectOutputStream(fos);
    oos.writeObject(c1);
    ObjectInputStream ois = null;
    FileInputStream fis = new FileInputStream("car.ser");
    ois = new ObjectInputStream(fis);
    Car c2 = (Car) ois.readObject();
    System.out.println("Number of tires = " + c2.getNumTires());
    System.out.println("Number of cylinders = " + c2.getEngine().getNumCylinders());
    System.out.println("Name = " + c2.getName());
  }
}