Originariamente inviato da andbin
Innanzitutto se si vuole avere la lunghezza di un file basta usare un java.io.File e il suo length().
Leggere tutto il contenuto del file solo per determinare la lunghezza non è il massimo della furbizia .... anche per un altro motivo: ormai sei arrivato a fondo, non leggi più nulla e dovresti istanziare un
nuovo FileInputStream perché non c'è modo di tornare indietro con lo stesso FileInputStream.
Anche il fatto di leggere l'intero contenuto e metterlo in un array non è il massimo della furbizia, dipende ovviamente dalle dimensioni del file. Ma in ogni caso c'è sempre un approccio migliore.
Che è quello di usare un array di byte di dimensioni prefissate e relativamente piccolo (es. 1024 byte o giù di lì) che fa da buffer e leggere a "blocchi" di byte. Cioè leggi un blocco da file e lo scrivi su socket, leggi un altro blocco ecc.....
Per la questione del trasferimento client-server c'è un discorso sul "protocollo". Se l'unica informazione trasferita è proprio solo il contenuto del file ... è un conto. Cioè se il mittente invia il contenuto del file, quindi close() e basta, dall'altra parte non ci sarebbero dubbi nel capire quando lo stream è finito.
In genere comunque è sempre bene anticipare al destinatario la dimensione di una sequenza di dati di lunghezza arbitraria. E questo tipicamente si fa inviando come "intestazione" ad esempio 4 byte che compongono un int (o 8 per un long) con la lunghezza della sequenza.