Java - ObjectInputStream Class
Introduction
The Java ObjectInputStream class deserializes primitive data and objects previously written using an ObjectOutputStream. Following are the important points about BufferedInputStream −
It is used to recover those objects previously serialized. It ensures that the types of all objects in the graph created from the stream match the classes present in the Java Virtual Machine.
Classes are loaded as required using the standard mechanisms.
Class declaration
Following is the declaration for Java.io.ObjectInputStream class −
public class ObjectInputStream
extends InputStream
implements ObjectInput, ObjectStreamConstants
Class constructors
| Sr.No. | Constructor & Description |
|---|---|
| 1 | protected ObjectInputStream() This provide a way for subclasses that are completely reimplementing ObjectInputStream to not have to allocate private data just used by this implementation of ObjectInputStream. |
| 2 | ObjectInputStream(InputStream in) This creates an ObjectInputStream that reads from the specified InputStream. |
Class methods
Methods inherited
This class inherits methods from the following classes −
- Java.io.InputStream
- Java.io.Object
- Java.io.ObjectInput
Example - Usage of ObjectInputStream available() method
The following example shows the usage of Java ObjectInputStream available() method.
ObjectInputStreamDemo.java
package com.tutorialspoint;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectInputStreamDemo {
public static void main(String[] args) {
try {
// create a new file with an ObjectOutputStream
FileOutputStream out = new FileOutputStream("test.txt");
ObjectOutputStream oout = new ObjectOutputStream(out);
// write something in the file
oout.writeUTF("Hello World");
oout.flush();
// create an ObjectInputStream for the file we created before
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
// check how many bytes are available
System.out.println("" + ois.available());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Output
Let us compile and run the above program, this will produce the following result−
13
Example - Closing an ObjectInputStream After Reading an Object
The following example shows the usage of Java ObjectInputStream close() method. This example writes an object to a file, reads it using ObjectInputStream, and then closes the stream.
ObjectInputStreamDemo.java
package com.tutorialspoint;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Person implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class ObjectInputStreamDemo {
public static void main(String[] args) {
try {
// Serialize object to file
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"));
oos.writeObject(new Person("Alice", 30));
oos.close();
// Read object from file
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"));
Person person = (Person) ois.readObject();
System.out.println("Read Object: " + person);
// Close the ObjectInputStream
ois.close();
// Trying to read again after closing
System.out.println("Trying to read again...");
ois.readObject(); // This will throw an IOException
} catch (IOException | ClassNotFoundException e) {
System.out.println("Exception: " + e.getMessage());
}
}
}
Output
Let us compile and run the above program, this will produce the following result−
Read Object: Person{name='Alice', age=30}
Trying to read again...
Exception: Stream Closed
Explanation
Writes a Person object to a file (person.dat).
Reads the object using ObjectInputStream.
Closes the stream using ois.close().
Attempts to read again after closing, which throws an IOException: Stream Closed.
Example - Using defaultReadObject() for Basic Serialization
The following example shows the usage of Java ObjectInputStream defaultReadObject() method. This example demonstrates default serialization using defaultReadObject()
ObjectInputStreamDemo.java
package com.tutorialspoint;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Person implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject(); // Restores default serialized fields
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class ObjectInputStreamDemo {
public static void main(String[] args) {
try {
// Serialize object
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"));
oos.writeObject(new Person("Alice", 30));
oos.close();
// Deserialize object
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"));
Person person = (Person) ois.readObject();
ois.close();
System.out.println("Deserialized Object: " + person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Output
Let us compile and run the above program, this will produce the following result−
Deserialized Object: Person{name='Alice', age=30}
Explanation
The Person object is serialized and written to person.dat.
During deserialization, defaultReadObject() restores the name and age fields.
The deserialized object is printed correctly.