Comment télécharger un fichier à partir d'une URL en Java ?

lundi 2 juillet 2001 • GF

Cet article de la FAQ a pour but de montrer comment télécharger un fichier depuis Internet vers son Disque Dur. On peut utiliser plusieurs méthodes, et celle à laquelle on pensera en premier lieu est sûrement d’implémenter un petit client FTP ou d’utiliser un JavaBean FTP comme celui d’IPWorks (dans JBuilder 5). Cependant, je propose ici une solution plus simple (beaucoup plus simple), à partir du moment où l’on connaît l’adresse exacte du fichier à télécharger. Cette méthode est également plus sécurisée, en cela que l’on a aucun besoin de spécifier un login et un mot de passe.

Nous allons donc utiliser une méthode avec URLConnection. Voici le code source commenté:

// Spécifier le chemin exact vers le fichier
URL u = new URL("http://www.monserveur.com:80/monrepertore/lisezmoi.txt");

// Ouvrir la connexion, début de la communication avec le serveur
URLConnection uc = u.openConnection();

// Récupérer la taille exacte en nombre d’octets du fichier désigné, et la stocker dans un int
int taille = uc.getContentLength();

// Créer un flux d’entrée pour le fichier
InputStream brut = uc.getInputStream();

// Mettre ce flux d’entrée en cache (pour un meilleur transfert, plus sûr et plus régulier).
InputStream entree = new BufferedInputStream(brut);

// Créer une matrice (un tableau) de bytes pour stocker tous les octets du fichier
byte[] donnees = new byte[taille];

// Pour l’instant aucun octet n’a encore été lu
int octetsLus = 0;

// Octets de déplacement, et octets déjà lus.
int deplacement = 0; float alreadyRead = 0;

// Boucle permettant de parcourir tous les octets du fichier à lire
while(deplacement < taille)
{
// utilisation de la methode "read" de la classe InputStream
octetsLus = entree.read(donnees, deplacement, donnees.length-deplacement);

// Petit calcul: mise à jour du nombre total d’octets lus par ajout au nombre d’octets lus au cours des précédents passages au nombre d’octets lus pendant ce passage
alreadyRead = alreadyRead + octetsLus;

// -1 marque par convention la fin d’un fichier, double opérateur "égale": = =
if(octetsLus == -1) break;

// se cadrer à un endroit précis du fichier pour lire les octets suivants, c’est le déplacement
deplacement += octetsLus;

}
// fermer le flux d’entrée.
entree.close();

// Récupérer le nom du fichier
String fichier = u.getFile();
fichier = fichier.substring(fichier.lastIndexOf(‘/’) + 1);

// Créer un fichier sur le DD afin d’y copier le contenu du fichier téléchargé (par un flux de sortie).
FileOutputStream fichierSortie = new FileOutputStream(fichier);

// copier…
fichierSortie.write(donnees);

// vider puis fermer le flux de sortie
fichierSortie.flush(); fichierSortie.close();

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Ecrit à Montpellier le 2 juillet 2001

Cet article de la FAQ a pour but de montrer comment télécharger un fichier depuis Internet vers son Disque Dur. On peut utiliser plusieurs méthodes, et celle à laquelle on pensera en premier lieu est sûrement d’implémenter un petit client FTP ou d’utiliser un JavaBean FTP comme celui d’IPWorks (dans JBuilder 5). Cependant, je propose ici une solution plus simple (beaucoup plus simple), à partir du moment où l’on connaît l’adresse exacte du fichier à télécharger. Cette méthode est également plus sécurisée, en cela que l’on a aucun besoin de spécifier un login et un mot de passe.

Nous allons donc utiliser une méthode avec URLConnection. Voici le code source commenté:

// Spécifier le chemin exact vers le fichier
URL u = new URL("http://www.monserveur.com:80/monrepertore/lisezmoi.txt");

// Ouvrir la connexion, début de la communication avec le serveur
URLConnection uc = u.openConnection();

// Récupérer la taille exacte en nombre d’octets du fichier désigné, et la stocker dans un int
int taille = uc.getContentLength();

// Créer un flux d’entrée pour le fichier
InputStream brut = uc.getInputStream();

// Mettre ce flux d’entrée en cache (pour un meilleur transfert, plus sûr et plus régulier).
InputStream entree = new BufferedInputStream(brut);

// Créer une matrice (un tableau) de bytes pour stocker tous les octets du fichier
byte[] donnees = new byte[taille];

// Pour l’instant aucun octet n’a encore été lu
int octetsLus = 0;

// Octets de déplacement, et octets déjà lus.
int deplacement = 0; float alreadyRead = 0;

// Boucle permettant de parcourir tous les octets du fichier à lire
while(deplacement < taille)
{
// utilisation de la methode "read" de la classe InputStream
octetsLus = entree.read(donnees, deplacement, donnees.length-deplacement);

// Petit calcul: mise à jour du nombre total d’octets lus par ajout au nombre d’octets lus au cours des précédents passages au nombre d’octets lus pendant ce passage
alreadyRead = alreadyRead + octetsLus;

// -1 marque par convention la fin d’un fichier, double opérateur "égale": = =
if(octetsLus == -1) break;

// se cadrer à un endroit précis du fichier pour lire les octets suivants, c’est le déplacement
deplacement += octetsLus;

}
// fermer le flux d’entrée.
entree.close();

// Récupérer le nom du fichier
String fichier = u.getFile();
fichier = fichier.substring(fichier.lastIndexOf(‘/’) + 1);

// Créer un fichier sur le DD afin d’y copier le contenu du fichier téléchargé (par un flux de sortie).
FileOutputStream fichierSortie = new FileOutputStream(fichier);

// copier…
fichierSortie.write(donnees);

// vider puis fermer le flux de sortie
fichierSortie.flush(); fichierSortie.close();

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Ecrit à Montpellier le 2 juillet 2001