Complete Java StreamCorruptedException class tutorial covering all methods with examples. Learn about stream corruption handling in Java I/O.
Last modified: April 16, 2025
The java.io.StreamCorruptedException is thrown when the stream header is invalid or when control information read from the stream violates consistency checks. It indicates corruption in object serialization streams.
This exception typically occurs during deserialization when reading objects from an ObjectInputStream. It signals that the stream data is corrupted or was written incorrectly. The exception extends ObjectStreamException.
StreamCorruptedException is part of Java’s object serialization mechanism. It contains constructors to create exceptions with or without detail messages. The class inherits standard exception functionality from its hierarchy.
public class StreamCorruptedException extends ObjectStreamException { public StreamCorruptedException(); public StreamCorruptedException(String reason); }
The code above shows the simple structure of StreamCorruptedException. The parameterless constructor creates an exception without a message. The second constructor allows specifying a detailed error message explaining the corruption.
This example demonstrates a simple case where StreamCorruptedException occurs. We’ll intentionally corrupt a serialized stream by modifying its header. The exception helps detect invalid serialization streams early.
Main.java
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
// Create a byte array output stream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
// Write a simple string
oos.writeObject("Hello, World!");
oos.close();
// Get the bytes and corrupt the stream header
byte[] data = baos.toByteArray();
data[0] = 0; // Corrupt the magic number
// Try to read the corrupted stream
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais);
// This will throw StreamCorruptedException
String s = (String) ois.readObject();
ois.close();
} catch (StreamCorruptedException e) {
System.err.println("Stream corrupted: " + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
In this example, we first serialize a string to a byte array. Then we deliberately corrupt the stream header by changing the first byte. When attempting to deserialize, the invalid header triggers StreamCorruptedException.
This example shows how version mismatches between serialization and deserialization can cause StreamCorruptedException. Different JVMs or serialization versions may produce incompatible streams.
Main.java
import java.io.*;
public class Main {
static class Data implements Serializable {
private static final long serialVersionUID = 1L;
String value;
Data(String value) {
this.value = value;
}
}
public static void main(String[] args) {
try {
// Serialize with one version UID
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new Data("Test"));
oos.close();
// Get bytes and modify version UID in the stream
byte[] data = baos.toByteArray();
// Simulate version change by altering serialVersionUID bytes
data[20] = (byte) ~data[20];
// Attempt deserialization
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais);
// This throws StreamCorruptedException
Data d = (Data) ois.readObject();
ois.close();
} catch (StreamCorruptedException e) {
System.err.println("Version mismatch detected: " + e);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Here we simulate a version mismatch by altering the serialVersionUID in the stream. The deserialization fails with StreamCorruptedException because the modified version doesn’t match the class definition. This protects against incompatible serialized data.
This example demonstrates how an invalid stream header format causes StreamCorruptedException. The header contains magic numbers and version info that must match expected values.
Main.java
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
// Create a valid serialized stream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject("Valid data");
oos.close();
// Prepend invalid header bytes
byte[] validData = baos.toByteArray();
byte[] invalidData = new byte[validData.length + 4];
System.arraycopy(validData, 0, invalidData, 4, validData.length);
// Try to deserialize
ByteArrayInputStream bais = new ByteArrayInputStream(invalidData);
ObjectInputStream ois = new ObjectInputStream(bais);
// Throws StreamCorruptedException due to invalid header
String s = (String) ois.readObject();
ois.close();
} catch (StreamCorruptedException e) {
System.err.println("Invalid stream header: " + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
We create a valid serialized stream then prepend extra bytes to corrupt the header format. The ObjectInputStream detects the invalid header immediately and throws StreamCorruptedException. This prevents processing of malformed streams.
This example shows how StreamCorruptedException helps detect truncated streams. Incomplete serialization data causes consistency check failures during deserialization.
Main.java
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
// Serialize multiple objects
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject("First object");
oos.writeObject("Second object");
oos.close();
// Truncate the stream data
byte[] fullData = baos.toByteArray();
byte[] truncatedData = new byte[fullData.length / 2];
System.arraycopy(fullData, 0, truncatedData, 0, truncatedData.length);
// Attempt deserialization
ByteArrayInputStream bais = new ByteArrayInputStream(truncatedData);
ObjectInputStream ois = new ObjectInputStream(bais);
// First object reads fine
String first = (String) ois.readObject();
System.out.println("Read: " + first);
// Second object throws StreamCorruptedException
String second = (String) ois.readObject();
ois.close();
} catch (StreamCorruptedException e) {
System.err.println("Truncated stream detected: " + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
We serialize two objects then truncate the byte array. The first object deserializes successfully, but attempting to read the second throws StreamCorruptedException. The exception indicates the stream ended unexpectedly during deserialization.
This example demonstrates how invalid custom serialization can cause StreamCorruptedException. The writeObject and readObject methods must maintain consistency.
Main.java
import java.io.*;
public class Main {
static class CustomData implements Serializable {
private String value;
CustomData(String value) {
this.value = value;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeInt(123); // Write extra data
}
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException {
in.defaultReadObject();
// Forget to read the extra data
}
}
public static void main(String[] args) {
try {
// Serialize
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new CustomData("Test"));
oos.close();
// Deserialize
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
// Throws StreamCorruptedException due to unread data
CustomData cd = (CustomData) ois.readObject();
ois.close();
} catch (StreamCorruptedException e) {
System.err.println("Custom serialization error: " + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
The CustomData class writes extra data in writeObject but doesn’t read it in readObject. This inconsistency causes StreamCorruptedException during deserialization. The exception helps catch serialization/deserialization mismatches.
This example simulates network stream corruption that might cause StreamCorruptedException. Network issues can corrupt serialized data during transmission.
Main.java
import java.io.*; import java.util.Arrays;
public class Main {
public static void main(String[] args) {
try {
// Simulate network transmission with potential corruption
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(Arrays.asList("A", "B", "C"));
oos.close();
// Simulate network corruption by flipping some bits
byte[] transmitted = baos.toByteArray();
for (int i = 10; i < 20; i++) {
transmitted[i] = (byte) ~transmitted[i];
}
// Attempt deserialization
ByteArrayInputStream bais = new ByteArrayInputStream(transmitted);
ObjectInputStream ois = new ObjectInputStream(bais);
// Throws StreamCorruptedException due to corrupted data
java.util.List<?> list = (java.util.List<?>) ois.readObject();
ois.close();
System.out.println("Read list: " + list);
} catch (StreamCorruptedException e) {
System.err.println("Network corruption detected: " + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
We simulate network corruption by flipping bits in the serialized data. The ObjectInputStream detects the corrupted data and throws StreamCorruptedException. In real applications, checksums or retransmission would handle such errors.
Java StreamCorruptedException Class Documentation
In this article, we’ve explored various scenarios that can cause StreamCorruptedException in Java. Understanding these cases helps develop robust serialization code and proper error handling.
My name is Jan Bodnar, and I am a dedicated programmer with many years of experience in the field. I began writing programming articles in 2007 and have since authored over 1,400 articles and eight e-books. With more than eight years of teaching experience, I am committed to sharing my knowledge and helping others master programming concepts.
List all Java tutorials.