StreamCorruptedException viene sollevata quanto tenti di leggere da un ObjectInputStream (o, in generale, da uno Stream) dei dati che lui non si aspetta di trovare (perchè magari sono di tipo diverso da ciò che si aspetta).
Ad esempio, se metti in ascolto da tastiera un ObjectInputStream riceverai quel tipo di eccezione per il seguente motivo: la readObject() si aspetta di ricevere un Oggetto Java, ma trova una serie di caratteri iniziali che non rappresentano l'intestazione di una classe.
Gli oggetti, infatti, sono rappresentati in memoria tramite un "preambolo" di byte che indicano alla JVM che si tratta di un Object, quindi c'è la parte di dati, poi (probabilmente) c'è una serie di byte che identifica la fine dell'oggetto. Quindi, ad esempio, una Stringa potrebbe essere rappresentata così:
codice:
[PREAMBOLO]Questa è la stringa[FINE_DATI]
Dove PREAMBOLO potrebbe essere una cosa del genere (ovviamente codificata):
codice:
Tipo: Object
Sottotipo: String
Versione JVM: 1.4.2
ObjectClassID: 0000255648956100156
e FINE_DATI potrebbe essere un byte che rappresenta la fine dei dati (come un EOF).
Se tu metti in ascolto un ObjectInputStream sulla tastiera e cominci a scriverci "Questa è la stringa", il primo carattere che arriva alla readObject() è la Q, il successivo è la u e probabilmente già al primo carattere ti segnala l'eccezione perchè il PREAMBOLO deve cominciare con un particolare carattere...
Ciao.