Comment télécharger un fichier à partir d’une URL en Java ?
Dans ce tutoriel, nous verrons plusieurs méthodes que nous pouvons utiliser pour télécharger un fichier.
Nous allons couvrir des exemples allant de l’utilisation de base de Java IO au package NIO, en passant par certaines bibliothèques communes telles que Apache Commons IO.
Java IO
Le package Java IO est le package de base pour télécharger un fichier à partir d’une URL. Ici, nous allons utiliser BufferedInputStream et les classes d’URL pour ouvrir et lire un fichier d’une adresse donnée à un fichier de notre système local. La raison pour laquelle nous utilisons la classe BufferedInputStream à la place de InputStream est sa capacité de mise en mémoire qui donne à notre code une amélioration de performances.
La classe java.net.URL en Java est une bibliothèque intégrée qui offre plusieurs méthodes pour accéder aux données et les manipuler sur Internet. Dans ce cas, nous utiliserons la fonction openStream() de la classe URL. La signature de la méthode openStream() est la suivante:
public final InputStream openStream() throws IOException
La fonction openStream() fonctionne sur un objet de la classe URL. La classe URL ouvre une connexion à l’URL donnée et la méthode openStream() renvoie un flux d’entrée utilisé pour lire les données de la connexion.
La deuxième classe que nous allons utiliser est BufferedInputStreamReader et FileOutputStream. Ces classes sont utilisées pour lire à partir d’un fichier et y écrire, respectivement.
try (BufferedInputStream bis = new BufferedInputStream(new URL("http://test.com/myfile.txt").openStream()); FileOutputStream fos = new FileOutputStream("/Desktop/myfile.txt")) { byte data[] = new byte[1024]; int byteContent; while ((byteContent = bis.read(data, 0, 1024)) != -1) { fos.write(data, 0, byteContent); } } catch (IOException e) { e.printStackTrace(System.out); }
Java NIO
Java NIO est un package alternatif permettant de gérer les opérations réseau et les entrées-sorties en Java. L’avantage du package Java NIO est qu’il ne se bloque pas et qu’il dispose de fonctionnalités de canalisation et de mise en mémoire. Lorsque nous utilisons la bibliothèque Java IO, nous travaillons avec des flux qui lisent les données octet par octet. Cependant, le package Java NIO utilise des canaux et des buffers. Les fonctions de mise en mémoire et de canalisation permettent au système de copier le contenu d’une URL directement dans le fichier souhaité sans avoir à enregistrer les octets dans la mémoire de l’application, ce qui constituerait une étape intermédiaire. La capacité de travailler avec des canaux améliore les performances.
Afin de télécharger le contenu d’une URL, nous allons utiliser les classes ReadableByteChannel et FileChannel.
ReadableByteChannel rbc = Channels.newChannel(new URL("http://test.com/myfile.txt").openStream());
La classe ReadableByteChannel crée un flux pour lire le contenu à partir de l’URL. Le contenu téléchargé sera transféré dans un fichier sur le système local via le canal correspondant
FileOutputStream fos = new FileOutputStream("/Desktop/myfile.txt"); FileChannel channel = fos.getChannel();
Après avoir défini le canal de fichier, nous utiliserons la méthode transferFrom() pour copier le contenu lu de l’objet « rbc » vers la destination du fichier à l’aide de l’objet « channel ».
channel.transferFrom(rbc, 0, Long.MAX_VALUE);
Apache Commons IO
La bibliothèque Apache Commons IO propose une liste de classes permettant de gérer les opérations IO. Maintenant, vous vous demandez peut-être pourquoi nous utilisons cela lorsque Java dispose de son propre bibliothèques pour gérer les opérations IO. Cependant, Apache Commons IO résout le problème de la réécriture du code et permet d’éviter d’écrire du code standard.
Pour télécharger un fichier à partir d’une URL donnée avec Apache Commons IO, nous avons besoin de la classe FileUtils. Une seule ligne de code est nécessaire pour télécharger un fichier, qui ressemble à ceci:
FileUtils.copyURLToFile( new URL("http://test.com/myfile.txt"), new File("/Desktop/myfile.txt"), CONNECTION_TIMEOUT, READ_TIMEOUT);
Conclusion
Nous avons vu dans ce Tutorial plusieurs façons pour télécharger un fichier à partir d’une URL en Java. L’implémentation la plus courante est celle dans laquelle nous mémorisons les octets lors de l’exécution des opérations de lecture / écriture. Cette implémentation est sûre à utiliser même pour les gros fichiers car nous ne chargeons pas l’ensemble du fichier en mémoire.