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

Download di un file in Java: codice d'esempio


001  package com.blogspot.pilloledijava.download;
002  
003  import java.io.BufferedInputStream;
004  import java.io.BufferedOutputStream;
005  import java.io.File;
006  import java.io.FileOutputStream;
007  import java.io.IOException;
008  import java.io.InputStream;
009  import java.io.OutputStream;
010  import java.net.URL;
011  
012  /**
013    * Classe che implementa due metodi per scaricare la risorsa identificata da un
014    * URL su un outputstream o su un file
015    
016    @author pdj
017    
018    */
019  public class Downloader {
020  
021    /**
022     * Metodo che scrive su un java.io.OutputStream la risorsa identificata da
023     * un URL
024     
025     @param url
026     *            URL da scaricare
027     @param outputStream
028     *            outputstream di destinazione
029     @param bufferSize
030     *            numero di byte letti ad ogni iterazione
031     @throws IOException
032     *             potrebbe essere causata da problemi sia nella sorgente (ad
033     *             esempio url irraggiungibile) che nella destinazione (problemi
034     *             vari di I/O).
035     */
036    public static void download(final URL url, final OutputStream outputStream,
037        final int bufferSizethrows IOException {
038      // Url input stream
039      final InputStream inputStream = url.openStream();
040      try {
041        // I BufferedInputStream e BufferedOutputStream non sono necessari
042        // ma migliorano le performance
043        final BufferedInputStream bufferedInputStream = new BufferedInputStream(
044            inputStream);
045        try {
046          final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
047              outputStream);
048          try {
049            final byte[] buffer = new byte[bufferSize];
050            int count;
051            while ((count = bufferedInputStream.read(buffer)) 0) {
052              bufferedOutputStream.write(buffer, 0, count);
053            }
054  
055          finally {
056            bufferedOutputStream.close();
057          }
058        finally {
059          bufferedInputStream.close();
060        }
061      finally {
062        inputStream.close();
063      }
064    }
065  
066    /**
067     * Metodo che salva su un file su un java.io.File la risorsa identificata da
068     * un URL
069     
070     @param url
071     *            URL da scaricare
072     @param outputStream
073     *            outputstream di destinazione
074     @param bufferSize
075     *            numero di byte letti ad ogni iterazione
076     @throws IOException
077     *             potrebbe essere causata da problemi sia nella sorgente (ad
078     *             esempio url irraggiungibile) che nella destinazione (file già
079     *             esistente, problemi di permessi, ...).
080     */
081  
082    public static void download(final URL url, final File file,
083        final int bufferSizethrows IOException {
084      if (file.exists()) {
085        throw new IllegalArgumentException(file.getAbsolutePath()
086            " already exists");
087      }
088  
089      final FileOutputStream fileOutputStream = new FileOutputStream(file);
090      try {
091        download(url, fileOutputStream, bufferSize);
092        fileOutputStream.flush();
093      finally {
094        fileOutputStream.close();
095      }
096    }
097  
098    /**
099     * Metodo main usato per test
100     
101     @param args
102     */
103    public static void main(String[] args) {
104      try {
105        URL url = new URL("http://pilloledijava.blogspot.com/");
106        File f = new File("/home/pdj/Scrivania/blog.html");
107        download(url, f, 4096);
108      catch (Exception e) {
109        e.printStackTrace();
110      }
111    }
112  
113  }

Post correlati:
Download di un file in Java