Comment télécharger et sauvegarder un fichier depuis Internet en utilisant Java ?

Il y a un fichier en ligne (tel que http://www.example.com/information.asp) que je dois saisir et enregistrer dans un répertoire. Je sais qu'il existe plusieurs méthodes pour récupérer et lire des fichiers en ligne (URL) ligne par ligne, mais existe-t-il un moyen de télécharger et d'enregistrer le fichier en utilisant Java ?

Solution

Essayez [Java NIO][1] :

URL website = new URL("http://www.website.com/information.asp");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("information.html");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

Utiliser transferFrom() est potentiellement beaucoup plus efficace qu'une simple boucle qui lit depuis le canal source et écrit sur ce canal. De nombreux systèmes d'exploitation peuvent transférer des octets directement du canal source vers le cache du système de fichiers sans les copier réellement.

Vous trouverez plus d'informations à ce sujet [ici][2].

Note : Le troisième paramètre de transferFrom est le nombre maximum d'octets à transférer. Integer.MAX_VALUE transférera au maximum 2^31 octets, Long.MAX_VALUE permettra au maximum 2^63 octets (plus grand que tout fichier existant).

[1] : http://en.wikipedia.org/wiki/New_I/O [2] : http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html

Commentaires (23)
public void saveUrl(final String filename, final String urlString)
        throws MalformedURLException, IOException {
    BufferedInputStream in = null;
    FileOutputStream fout = null;
    try {
        in = new BufferedInputStream(new URL(urlString).openStream());
        fout = new FileOutputStream(filename);

        final byte data[] = new byte[1024];
        int count;
        while ((count = in.read(data, 0, 1024)) != -1) {
            fout.write(data, 0, count);
        }
    } finally {
        if (in != null) {
            in.close();
        }
        if (fout != null) {
            fout.close();
        }
    }
}

Vous devrez gérer les exceptions, probablement en dehors de cette méthode.

Commentaires (8)

Le téléchargement d'un fichier exige que vous le lisiez. Dans les deux cas, vous devrez parcourir le fichier d'une manière ou d'une autre. Au lieu de le lire ligne par ligne, vous pouvez simplement le lire par octets à partir du flux :

BufferedInputStream in = new BufferedInputStream(new URL("http://www.website.com/information.asp").openStream())
    byte data[] = new byte[1024];
    int count;
    while((count = in.read(data,0,1024)) != -1)
    {
        out.write(data, 0, count);
    }
Commentaires (0)