sabato 9 aprile 2011

Download di un file in Java

In Java per scaricare un file, ma più in generale per ottenere una risorsa identificata da un URL, è necessario:
  1. Istanziare un URL con l'indirizzo della risorsa. Il metodo più semplice è quello di utilizzare il costruttore della classe java.net.URL che ha come unico paramentro la stringa corrispondente all'indirizzo (riga 105 del codice d'esempio).
  2. Aprire l'inputStream corrispondente (riga 39).
  3. Allocare un java.io.BufferedInputStream (riga 43) corrispondente all'InputStream aperto in precedenza. Questa operazione, al pari della precedente, migliora le prestazioni limitando le chiamate di sistema alle funzioni di I/O
  4. Allocare un java.io.BufferedOutputStream (riga 46) corrispondente all'outputStream sul quale scrivere il contenuto della risorsa.
  5. Allocare un array di byte da usare come buffer per la copia dei dati. La dimensione del buffer va ponderata a seconda delle esigenze, tenendo conto che un buffer troppo piccolo limita le prestazioni mentre una dimensione troppo grande fa sì che tutto il contenuto rimanga in memoria (potrebbero sorgere problemi anche gravi come java.lang.OutOfMemoryError).
  6. Le righe 51 e 52 sono quelle in cui avviene la copia. Vengono infatti letti ad ogni iterazione un certo numero di byte (variabile count) dall'input e scritti nell'output.
  7. Le righe successive servono per chiudere le risorse allocate in precedenza, secondo il "dispose pattern"

Il secondo metodo alloca un java.io.FileOutputStream per implementare quello che sarà probabilmente l'utilizzo più diffuso del metodo precedente cioè il download su un file locale della risorsa desiderata.

Post correlati:
Download di un file in Java: codice d'esempio

2 commenti:

  1. Ottimo e semplicissimo esempio.
    Oltre che estremamente utile per buttare giù le fondamenta di un auto updater.

    RispondiElimina
  2. A me serviva per scaricare dei documenti secondo una certa logica che era difficile da gestire con un wget e bash scripting, per cui ho deciso di pubblicare il metodo principale. Spero possa essere utile.

    RispondiElimina