Originariamente inviato da Poker1
ma ancora l'mp3 viene mandato sempre nello stesso modo, viene scritto il primo messaggio per tutta la durata della canzone. Ho notato anche che l'mp3 origunale e' 3.222 KB e quello inviato e' 3.223 KB
Immagino che nella classe Messaggio assegni ad un campo interno l'array passato al costruttore. Cioè vuol dire sostanzialmente che durante il processo di serializzazione vengono serializzati tutti i 10000 byte dell'array. L'ultimo blocco potrebbe però contenere meno dati, ovviamente. Ma facendo fos.write( tmp ); tu scrivi tutti questi 10000 byte. Devi usare l'altro write() a cui indicare anche la lunghezza. O in alternativa quando crei un Messaggio, dovresti allocare un nuovo array di dimensione "giusta" per contenere i dati.

Comunque non è il caso di fare:
codice:
byte[] tmp = new byte[quanti];
byte[] data = letto.getData();
tmp = data;
letto.getData() ti ritorna l'array e devi scrivere direttamente quello!