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 saisir et lire les fichiers en ligne (URL) ligne par ligne, mais existe-t-il un moyen de simplement télécharger et enregistrer le fichier à l'aide de Java?
425
Réponses:
Essayez Java NIO :
L'utilisation
transferFrom()
est potentiellement beaucoup plus efficace qu'une simple boucle qui lit à partir du canal source et écrit sur ce canal. De nombreux systèmes d'exploitation peuvent transférer des octets directement du canal source dans le cache du système de fichiers sans les copier.Vérifiez plus à ce sujet ici .
Remarque : Le troisième paramètre dans transferFrom est le nombre maximal d'octets à transférer.
Integer.MAX_VALUE
transférera au plus 2 ^ 31 octets,Long.MAX_VALUE
autorisera au plus 2 ^ 63 octets (plus grand que n'importe quel fichier existant).la source
8388608
tuberculose?transferFrom()
n'est pas spécifié pour effectuer l'intégralité du transfert en un seul appel. C'est pourquoi il renvoie un décompte. Vous devez faire une boucle.URL::openStream()
renvoie juste un flux régulier, ce qui signifie que tout le trafic est toujours copié via des tableaux d'octets Java [] au lieu de rester dans des tampons natifs. Seulfos.getChannel()
est en fait un canal natif, donc la surcharge reste complète. C'est zéro gain de l'utilisation de NIO dans ce cas. En plus d'être cassé, comme EJP et Ben MacCann l'ont correctement remarqué.Utilisez apache commons-io , juste un code de ligne:
la source
copyURLToFile
paramètre timeout n'est disponible que depuis la version 2.0 de la bibliothèque Commons IO. Voir les documents JavaUtilisation nio plus simple:
la source
InputStream.read()
de retourner zéro sauf si vous avez fourni un tampon de longueur nulle ou un décompte, une "petite pause" ou autre. Il se bloquera jusqu'à ce qu'au moins un octet ait été transféré ou à la fin du flux ou qu'une erreur se produise. Votre affirmation sur les éléments internes deFiles.copy()
est sans fondement.Vous devrez gérer les exceptions, probablement externes à cette méthode.
la source
in.close
lève une exception,fout.close
n'est pas appelé.BufferedInputStream
n'a aucun effet sur les délais d'expiration des sockets. J'avais déjà réfuté cela comme «mythe urbain» dans mes commentaires aux «détails de base» que vous avez cités. Trois ans plus tôt.BufferedInputStream
"peut provoquer des échecs imprévisibles").C'est une vieille question, mais voici une solution concise, lisible et uniquement JDK avec des ressources correctement fermées:
Deux lignes de code et aucune dépendance.
la source
import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths;
Pour télécharger un fichier, vous devez le lire, de toute façon vous devrez parcourir le fichier d'une manière ou d'une autre. Au lieu de ligne par ligne, vous pouvez simplement le lire en octets à partir du flux:
la source
Lors de l'utilisation,
Java 7+
utilisez la méthode suivante pour télécharger un fichier depuis Internet et l'enregistrer dans un répertoire:Documentation ici .
la source
Cette réponse est presque exactement comme la réponse sélectionnée mais avec deux améliorations: c'est une méthode et elle ferme l'objet FileOutputStream:
la source
transferFrom()
n'est pas spécifié pour effectuer l'intégralité du transfert en un seul appel. C'est pourquoi il renvoie un décompte. Vous devez faire une boucle.la source
in.close
lève une exception,out.close
n'est pas appelé.Personnellement, j'ai trouvé que le HttpClient d' Apache était plus que capable de tout ce que j'avais besoin de faire à ce sujet. Voici un excellent tutoriel sur l'utilisation de HttpClient
la source
Ceci est une autre variante java7 basée sur la réponse de Brian Risk avec l'utilisation de l'instruction try-with:
la source
transferFrom()
n'est pas spécifié pour effectuer l'intégralité du transfert en un seul appel. C'est pourquoi il renvoie un décompte. Vous devez faire une boucle.Il est possible de télécharger le fichier avec avec Apache au
HttpComponents
lieu deCommons-IO
. Ce code vous permet de télécharger un fichier en Java en fonction de son URL et de l'enregistrer à la destination spécifique.Contrairement à la seule ligne de code:
ce code vous donnera plus de contrôle sur un processus et vous permet de spécifier non seulement les temps morts mais
User-Agent
et desReferer
valeurs qui sont essentielles pour de nombreux sites web.la source
Il existe de nombreuses réponses élégantes et efficaces ici. Mais la concision peut nous faire perdre des informations utiles. En particulier, on ne veut souvent pas considérer une erreur de connexion comme une exception , et on peut vouloir traiter différemment une sorte d'erreurs liées au réseau - par exemple, pour décider si nous devons réessayer le téléchargement.
Voici une méthode qui ne lève pas d'exceptions pour les erreurs réseau (uniquement pour des problèmes vraiment exceptionnels, comme une URL mal formée ou des problèmes d'écriture dans le fichier)
la source
Voici un exemple de code pour télécharger un film sur Internet avec du code java:
la source
Il y a un problème avec la simple utilisation de:
si vous devez télécharger et enregistrer des fichiers très volumineux, ou en général si vous avez besoin de nouvelles tentatives en cas de coupure de connexion.
Ce que je suggère dans de tels cas est Apache HttpClient avec org.apache.commons.io.FileUtils. Par exemple:
la source
Pour résumer (et en quelque sorte peaufiner et mettre à jour) les réponses précédentes. Les trois méthodes suivantes sont pratiquement équivalentes. (J'ai ajouté des délais d'attente explicites parce que je pense qu'ils sont indispensables, personne ne veut qu'un téléchargement se fige pour toujours lorsque la connexion est perdue.)
Je ne trouve pas de différences significatives, tout me semble juste. Ils sont sûrs et efficaces. (Les différences de vitesse ne semblent guère pertinentes - j'écris 180 Mo du serveur local sur un disque SSD à des moments qui fluctuent entre 1,2 et 1,5 segs). Ils ne nécessitent pas de bibliothèques externes. Tous fonctionnent avec des tailles arbitraires et (selon mon expérience) des redirections HTTP.
De plus, tous lancent
FileNotFoundException
si la ressource n'est pas trouvée (erreur 404, généralement), etjava.net.UnknownHostException
si la résolution DNS a échoué; les autres IOException correspondent à des erreurs lors de la transmission.(Marqué comme wiki communautaire, n'hésitez pas à ajouter des informations ou des corrections)
la source
Il y a la méthode U.fetch (url) dans la bibliothèque underscore-java .
pom.xml:
Exemple de code:
la source
Java
, mais votre réponse ressemble àJavaScript
la source
Vous pouvez le faire en 1 ligne en utilisant netloader pour Java :
la source
Si vous êtes derrière un proxy, vous pouvez définir les proxys dans le programme java comme ci-dessous:
Si vous n'êtes pas derrière un proxy, n'incluez pas les lignes ci-dessus dans votre code. Code de travail complet pour télécharger un fichier lorsque vous êtes derrière un proxy.
la source
1ère méthode utilisant le nouveau canal
2ème méthode utilisant FileUtils
3e méthode utilisant
C'est ainsi que nous pouvons télécharger des fichiers en utilisant du code Java de base et d'autres bibliothèques tierces. Ce sont juste pour référence rapide. Veuillez rechercher sur Google les mots-clés ci-dessus pour obtenir des informations détaillées et d'autres options.
la source