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

425

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?

écho
la source
1
connexes stackoverflow.com/questions/8324862/...
Adrien Soyez

Réponses:

560

Essayez Java NIO :

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);

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_VALUEtransférera au plus 2 ^ 31 octets, Long.MAX_VALUEautorisera au plus 2 ^ 63 octets (plus grand que n'importe quel fichier existant).

dfa
la source
22
Fermez les trois avec Java 7 try-with-resource: try (InputStream inputStream = website.openStream (); ReadableByteChannel readableByteChannel = Channels.newChannel (inputStream); FileOutputStream fileOutputStream = new FileOutputStream (outputFileName)). (readableByteChannel, 0, 1 << 24); }
mazatwork
80
Cela ne téléchargera que les 16 premiers Mo d'un fichier: stackoverflow.com/questions/8405062/downloading-files-with-java
Ben McCann
31
@kirdie et si je veux plus que de la 8388608tuberculose?
Cruncher
22
Un seul appel n'est pas suffisant. 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.
Marquis de Lorne
11
Pourquoi cette réponse a-t-elle même été acceptée? 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. Seul fos.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é.
Ext3h
495

Utilisez apache commons-io , juste un code de ligne:

FileUtils.copyURLToFile(URL, File)
卢 声 远 Shengyuan Lu
la source
22
Agréable! Exactement ce que je recherche! Je savais que les bibliothèques Apache couvriraient déjà cela. BTW, il est recommandé d'utiliser la version surchargée avec des paramètres de timeout!
Hendy Irawan
6
... et lorsque vous utilisez cette version surchargée, n'oubliez pas que les délais d'expiration sont spécifiés en millisecondes, pas en secondes.
László van den Hoek
5
Notez que le copyURLToFileparamètre timeout n'est disponible que depuis la version 2.0 de la bibliothèque Commons IO. Voir les documents Java
Stanley
6
que faire si un en-tête d'authentification de base doit être ajouté à la demande? Y at-il un travail autour?
damian
3
Bien que ce soit "court", c'est en fait très lent.
Meinkraft
123

Utilisation nio plus simple:

URL website = new URL("http://www.website.com/information.asp");
try (InputStream in = website.openStream()) {
    Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
}
xuesheng
la source
5
Malheureusement, cela échoue silencieusement (téléchargements 0 octets) en cas de redirection telle que "302 Trouvé".
Alexander K
1
@AlexanderK Mais pourquoi voudriez-vous télécharger aveuglément une telle ressource de toute façon?
xuesheng
5
Bien qu'il s'agisse d'une solution élégante, en coulisses, cette approche pourrait vous trahir en silence. Files.copy (InputStream, Paths, FileOption) délègue le processus de copie à Files.copy (InputStream, OutputStream). Cette dernière méthode ne vérifie pas la fin du flux (-1) mais vérifie l'absence de lecture d'octets (0). Cela signifie que, si votre réseau a eu une petite pause, il pourrait lire 0 octet et terminer le processus de copie, même si le flux n'est pas terminé pour être téléchargé par le système d'exploitation.
Miere
6
@Miere Il est impossible 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 de Files.copy()est sans fondement.
Marquis de Lorne
3
J'ai un test unitaire qui lit un fichier binaire avec 2,6 To. En utilisant Files.copy, il échoue toujours sur mon serveur de stockage HDD (XFS) mais il échoue seulement quelques fois sur mon SSH. En regardant JDK 8 le code de File.copy, j'ai identifié qu'il vérifie «> 0» pour quitter la boucle «while». Je viens de copier exactement le même code avec le -1 et les deux tests unitaires ne se sont plus jamais arrêtés. Une fois que InputStream peut représenter le réseau et les descripteurs de fichiers locaux, et que les deux opérations d'E / S sont sujettes au changement de contexte du système d'exploitation, je ne vois pas pourquoi ma revendication est sans fondement. On peut prétendre que cela fonctionne par chance, mais cela ne donne plus de maux de tête.
Miere
85
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 externes à cette méthode.

Ben Noland
la source
6
Comment télécharger très rapidement? Vous aimez l'accélérateur de téléchargement?
digz6666
11
Si in.closelève une exception, fout.closen'est pas appelé.
Béryllium
1
@ComFreek C'est tout simplement faux. L'utilisation de a BufferedInputStreamn'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.
Marquis de Lorne
@EJP Merci pour la correction! J'ai supprimé mon commentaire (pour l'archive: j'ai lié à cette réponse en déclarant que BufferedInputStream"peut provoquer des échecs imprévisibles").
ComFreek
+1 Ma seule objection à cette réponse (et à d'autres ici) est que l'appelant ne peut pas distinguer l'événement "introuvable" d'une erreur de connexion (sur laquelle vous voudrez peut-être réessayer).
leonbloy
24

C'est une vieille question, mais voici une solution concise, lisible et uniquement JDK avec des ressources correctement fermées:

public static void download(String url, String fileName) throws Exception {
    try (InputStream in = URI.create(url).toURL().openStream()) {
        Files.copy(in, Paths.get(fileName));
    }
}

Deux lignes de code et aucune dépendance.

Jan Nielsen
la source
Pour les personnes qui se demandent, voici l'importation nécessaire pour cet extrait de code:import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths;
BelovedFool
23

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:

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);
    }
z -
la source
17

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:

private static Path download(String sourceURL, String targetDirectory) throws IOException
{
    URL url = new URL(sourceURL);
    String fileName = sourceURL.substring(sourceURL.lastIndexOf('/') + 1, sourceURL.length());
    Path targetPath = new File(targetDirectory + File.separator + fileName).toPath();
    Files.copy(url.openStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);

    return targetPath;
}

Documentation ici .

BullyWiiPlaza
la source
16

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:

    public static void downloadFileFromURL(String urlString, File destination) {    
        try {
            URL website = new URL(urlString);
            ReadableByteChannel rbc;
            rbc = Channels.newChannel(website.openStream());
            FileOutputStream fos = new FileOutputStream(destination);
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
            fos.close();
            rbc.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Brian Risk
la source
2
Un seul appel n'est pas suffisant. 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.
Marquis de Lorne du
10
import java.io.*;
import java.net.*;

public class filedown {
    public static void download(String address, String localFileName) {
        OutputStream out = null;
        URLConnection conn = null;
        InputStream in = null;

        try {
            URL url = new URL(address);
            out = new BufferedOutputStream(new FileOutputStream(localFileName));
            conn = url.openConnection();
            in = conn.getInputStream();
            byte[] buffer = new byte[1024];

            int numRead;
            long numWritten = 0;

            while ((numRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, numRead);
                numWritten += numRead;
            }

            System.out.println(localFileName + "\t" + numWritten);
        } 
        catch (Exception exception) { 
            exception.printStackTrace();
        } 
        finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            } 
            catch (IOException ioe) {
            }
        }
    }

    public static void download(String address) {
        int lastSlashIndex = address.lastIndexOf('/');
        if (lastSlashIndex >= 0 &&
        lastSlashIndex < address.length() - 1) {
            download(address, (new URL(address)).getFile());
        } 
        else {
            System.err.println("Could not figure out local file name for "+address);
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            download(args[i]);
        }
    }
}
mumair
la source
5
Si in.closelève une exception, out.closen'est pas appelé.
Béryllium
8

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

belgariontheking
la source
2
commons-io est également une excellente bibliothèque
dfa
6

Ceci est une autre variante java7 basée sur la réponse de Brian Risk avec l'utilisation de l'instruction try-with:

public static void downloadFileFromURL(String urlString, File destination) throws Throwable {

      URL website = new URL(urlString);
      try(
              ReadableByteChannel rbc = Channels.newChannel(website.openStream());
              FileOutputStream fos = new FileOutputStream(destination);  
              ){
          fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
      }

  }
msangel
la source
Un seul appel n'est pas suffisant. 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.
Marquis de Lorne du
Je ne sais pas pourquoi vous m'adressez cette stupide question. Cela n'a rien à voir avec ce que j'ai dit, et je refuse vraiment de mettre des mots dans ma bouche.
Marquis de Lorne
2

Il est possible de télécharger le fichier avec avec Apache au HttpComponentslieu de Commons-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.

public static boolean saveFile(URL fileURL, String fileSavePath) {

    boolean isSucceed = true;

    CloseableHttpClient httpClient = HttpClients.createDefault();

    HttpGet httpGet = new HttpGet(fileURL.toString());
    httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0");
    httpGet.addHeader("Referer", "https://www.google.com");

    try {
        CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity fileEntity = httpResponse.getEntity();

        if (fileEntity != null) {
            FileUtils.copyInputStreamToFile(fileEntity.getContent(), new File(fileSavePath));
        }

    } catch (IOException e) {
        isSucceed = false;
    }

    httpGet.releaseConnection();

    return isSucceed;
}

Contrairement à la seule ligne de code:

FileUtils.copyURLToFile(fileURL, new File(fileSavePath),
                        URLS_FETCH_TIMEOUT, URLS_FETCH_TIMEOUT);

ce code vous donnera plus de contrôle sur un processus et vous permet de spécifier non seulement les temps morts mais User-Agentet des Referervaleurs qui sont essentielles pour de nombreux sites web.

Mike B.
la source
2

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)

/**
 * Downloads from a (http/https) URL and saves to a file. 
 * Does not consider a connection error an Exception. Instead it returns:
 *  
 *    0=ok  
 *    1=connection interrupted, timeout (but something was read)
 *    2=not found (FileNotFoundException) (404) 
 *    3=server error (500...) 
 *    4=could not connect: connection timeout (no internet?) java.net.SocketTimeoutException
 *    5=could not connect: (server down?) java.net.ConnectException
 *    6=could not resolve host (bad host, or no internet - no dns)
 * 
 * @param file File to write. Parent directory will be created if necessary
 * @param url  http/https url to connect
 * @param secsConnectTimeout Seconds to wait for connection establishment
 * @param secsReadTimeout Read timeout in seconds - trasmission will abort if it freezes more than this 
 * @return See above
 * @throws IOException Only if URL is malformed or if could not create the file
 */
public static int saveUrl(final Path file, final URL url, 
  int secsConnectTimeout, int secsReadTimeout) throws IOException {
    Files.createDirectories(file.getParent()); // make sure parent dir exists , this can throw exception
    URLConnection conn = url.openConnection(); // can throw exception if bad url
    if( secsConnectTimeout > 0 ) conn.setConnectTimeout(secsConnectTimeout * 1000);
    if( secsReadTimeout > 0 ) conn.setReadTimeout(secsReadTimeout * 1000);
    int ret = 0;
    boolean somethingRead = false;
    try (InputStream is = conn.getInputStream()) {
        try (BufferedInputStream in = new BufferedInputStream(is); OutputStream fout = Files
                .newOutputStream(file)) {
            final byte data[] = new byte[8192];
            int count;
            while((count = in.read(data)) > 0) {
                somethingRead = true;
                fout.write(data, 0, count);
            }
        }
    } catch(java.io.IOException e) { 
        int httpcode = 999;
        try {
            httpcode = ((HttpURLConnection) conn).getResponseCode();
        } catch(Exception ee) {}
        if( somethingRead && e instanceof java.net.SocketTimeoutException ) ret = 1;
        else if( e instanceof FileNotFoundException && httpcode >= 400 && httpcode < 500 ) ret = 2; 
        else if( httpcode >= 400 && httpcode < 600 ) ret = 3; 
        else if( e instanceof java.net.SocketTimeoutException ) ret = 4; 
        else if( e instanceof java.net.ConnectException ) ret = 5; 
        else if( e instanceof java.net.UnknownHostException ) ret = 6;  
        else throw e;
    }
    return ret;
}
leonbloy
la source
2

Voici un exemple de code pour télécharger un film sur Internet avec du code java:

URL url = new 
URL("http://103.66.178.220/ftp/HDD2/Hindi%20Movies/2018/Hichki%202018.mkv");
    BufferedInputStream bufferedInputStream = new  BufferedInputStream(url.openStream());
    FileOutputStream stream = new FileOutputStream("/home/sachin/Desktop/test.mkv");


    int count=0;
    byte[] b1 = new byte[100];

    while((count = bufferedInputStream.read(b1)) != -1) {
        System.out.println("b1:"+b1+">>"+count+ ">> KB downloaded:"+new File("/home/sachin/Desktop/test.mkv").length()/1024);
        stream.write(b1, 0, count);
    }
Sachin Rane
la source
Généralement, les réponses sont beaucoup plus utiles si elles incluent une explication de ce que le code est censé faire et pourquoi cela résout le problème sans en introduire d'autres.
Tim Diekmann
1

Il y a un problème avec la simple utilisation de:

org.apache.commons.io.FileUtils.copyURLToFile(URL, File) 

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:

GetMethod method = new GetMethod(resource_url);
try {
    int statusCode = client.executeMethod(method);
    if (statusCode != HttpStatus.SC_OK) {
        logger.error("Get method failed: " + method.getStatusLine());
    }       
    org.apache.commons.io.FileUtils.copyInputStreamToFile(
        method.getResponseBodyAsStream(), new File(resource_file));
    } catch (HttpException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    method.releaseConnection();
}
oktieh
la source
1

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.)

public static void saveUrl1(final Path file, final URL url,
   int secsConnectTimeout, int secsReadTimeout)) 
    throws MalformedURLException, IOException {
    // Files.createDirectories(file.getParent()); // optional, make sure parent dir exists
    try (BufferedInputStream in = new BufferedInputStream(
       streamFromUrl(url, secsConnectTimeout,secsReadTimeout)  );
        OutputStream fout = Files.newOutputStream(file)) {
        final byte data[] = new byte[8192];
        int count;
        while((count = in.read(data)) > 0)
            fout.write(data, 0, count);
    }
}

public static void saveUrl2(final Path file, final URL url,
   int secsConnectTimeout, int secsReadTimeout))  
    throws MalformedURLException, IOException {
    // Files.createDirectories(file.getParent()); // optional, make sure parent dir exists
    try (ReadableByteChannel rbc = Channels.newChannel(
      streamFromUrl(url, secsConnectTimeout,secsReadTimeout) 
        );
        FileChannel channel = FileChannel.open(file,
             StandardOpenOption.CREATE, 
             StandardOpenOption.TRUNCATE_EXISTING,
             StandardOpenOption.WRITE) 
        ) {
        channel.transferFrom(rbc, 0, Long.MAX_VALUE);
    }
}

public static void saveUrl3(final Path file, final URL url, 
   int secsConnectTimeout, int secsReadTimeout))  
    throws MalformedURLException, IOException {
    // Files.createDirectories(file.getParent()); // optional, make sure parent dir exists
    try (InputStream in = streamFromUrl(url, secsConnectTimeout,secsReadTimeout) ) {
        Files.copy(in, file, StandardCopyOption.REPLACE_EXISTING);
    }
}

public static InputStream streamFromUrl(URL url,int secsConnectTimeout,int secsReadTimeout) throws IOException {
    URLConnection conn = url.openConnection();
    if(secsConnectTimeout>0) conn.setConnectTimeout(secsConnectTimeout*1000);
    if(secsReadTimeout>0) conn.setReadTimeout(secsReadTimeout*1000);
    return conn.getInputStream();
}

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 FileNotFoundExceptionsi 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)

leonbloy
la source
1

Il y a la méthode U.fetch (url) dans la bibliothèque underscore-java .

pom.xml:

  <groupId>com.github.javadev</groupId>
  <artifactId>underscore</artifactId>
  <version>1.45</version>

Exemple de code:

import com.github.underscore.lodash.U;

public class Download {
    public static void main(String ... args) {
        String text = U.fetch("https://stackoverflow.com/questions"
        + "/921262/how-to-download-and-save-a-file-from-internet-using-java").text();
    }
}
Valentyn Kolesnikov
la source
Quelle est l'utilité de cette réponse lorsque le lien devient invalide? Veuillez consulter Comment répondre
JimHawkins
Votre code ne compile pas. Question demander une solution Java, mais votre réponse ressemble àJavaScript
talex
@talex J'ai ajouté une section pom.xml et un exemple de code amélioré.
Valentyn Kolesnikov
0
public class DownloadManager {

    static String urls = "[WEBSITE NAME]";

    public static void main(String[] args) throws IOException{
        URL url = verify(urls);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStream in = null;
        String filename = url.getFile();
        filename = filename.substring(filename.lastIndexOf('/') + 1);
        FileOutputStream out = new FileOutputStream("C:\\Java2_programiranje/Network/DownloadTest1/Project/Output" + File.separator + filename);
        in = connection.getInputStream();
        int read = -1;
        byte[] buffer = new byte[4096];
        while((read = in.read(buffer)) != -1){
            out.write(buffer, 0, read);
            System.out.println("[SYSTEM/INFO]: Downloading file...");
        }
        in.close();
        out.close();
        System.out.println("[SYSTEM/INFO]: File Downloaded!");
    }
    private static URL verify(String url){
        if(!url.toLowerCase().startsWith("http://")) {
            return null;
        }
        URL verifyUrl = null;

        try{
            verifyUrl = new URL(url);
        }catch(Exception e){
            e.printStackTrace();
        }
        return verifyUrl;
    }
}
Gegi4321
la source
Vous pouvez améliorer votre réponse en fournissant des informations sur le fonctionnement de votre code au lieu de simplement le vider.
Matej Kormuth
0

Vous pouvez le faire en 1 ligne en utilisant netloader pour Java :

new NetFile(new File("my/zips/1.zip"), "https://example.com/example.zip", -1).load(); //returns true if succeed, otherwise false.
Célestine
la source
0

Si vous êtes derrière un proxy, vous pouvez définir les proxys dans le programme java comme ci-dessous:

        Properties systemSettings = System.getProperties();
        systemSettings.put("proxySet", "true");
        systemSettings.put("https.proxyHost", "https proxy of your org");
        systemSettings.put("https.proxyPort", "8080");

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.

public static void main(String[] args) throws IOException {
        String url="https://raw.githubusercontent.com/bpjoshi/fxservice/master/src/test/java/com/bpjoshi/fxservice/api/TradeControllerTest.java";
        OutputStream outStream=null;
        URLConnection connection=null;
        InputStream is=null;
        File targetFile=null;
        URL server=null;
        //Setting up proxies
        Properties systemSettings = System.getProperties();
            systemSettings.put("proxySet", "true");
            systemSettings.put("https.proxyHost", "https proxy of my organisation");
            systemSettings.put("https.proxyPort", "8080");
            //The same way we could also set proxy for http
            System.setProperty("java.net.useSystemProxies", "true");
            //code to fetch file
        try {
            server=new URL(url);
            connection = server.openConnection();
            is = connection.getInputStream();
            byte[] buffer = new byte[is.available()];
            is.read(buffer);

                targetFile = new File("src/main/resources/targetFile.java");
                outStream = new FileOutputStream(targetFile);
                outStream.write(buffer);
        } catch (MalformedURLException e) {
            System.out.println("THE URL IS NOT CORRECT ");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Io exception");
            e.printStackTrace();
        }
        finally{
            if(outStream!=null) outStream.close();
        }
    }
bpjoshi
la source
0

1ère méthode utilisant le nouveau canal

ReadableByteChannel aq = Channels.newChannel(new url("https//asd/abc.txt").openStream());
FileOutputStream fileOS = new FileOutputStream("C:Users/local/abc.txt")
FileChannel writech = fileOS.getChannel();

2ème méthode utilisant FileUtils

FileUtils.copyURLToFile(new url("https//asd/abc.txt",new local file on system("C":/Users/system/abc.txt"));

3e méthode utilisant

InputStream xy = new ("https//asd/abc.txt").openStream();

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.

Ashish Gupta
la source