Il motivo e' semplice: il metodo read() ti restituisce il codice ASCII del carattere che hai letto, di conseguenza un 3 non viene rappresentato come il numero decimale 3, ma come 51. Per fare quello che intendi tu devi usare delle classi piu' specifiche, che ti consentano di leggere gli oggetti e i dati primitivi, oppure implementarti da solo i metodi per la conversione dei byte letti in quello che tu ti aspetti che siano (cioe' numeri, lettere, stringhe, ecc...)