Una "miglioria" è sicuramente quella di non usare ObjectInputStream e ObjectOutputStream, se non sono strettamente richiesti dal protocollo, che effettuano, per nulla, una serializzazione dell'oggetto. Se devi semplicemente trasferire dei byte, usa direttamente i semplici InputStream/OutputStream della socket... al massimo wrappali su degli stream bufferizzati.

Altra "miglioria": perchè leggere prima tutto il file per poi inviarlo? Invialo man mano che lo leggi, così non hai bisogno di tutta quella memoria...

Altra soluzione che dovrebbe migliorare le prestazioni è usare java.nio con i SocketChannel e FileChannel.


Ciao.