Jak pobrać i zapisać plik z Internetu za pomocą Java?

425

Jest plik online (taki jak http://www.example.com/information.asp), który muszę pobrać i zapisać w katalogu. Wiem, że istnieje kilka metod pobierania i odczytywania plików online (adresów URL) wiersz po wierszu, ale czy istnieje sposób, aby po prostu pobrać i zapisać plik przy użyciu Java?

echoblaze
źródło

Odpowiedzi:

559

Wypróbuj 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);

Korzystanie transferFrom()jest potencjalnie znacznie bardziej wydajne niż prosta pętla, która czyta z kanału źródłowego i zapisuje na tym kanale. Wiele systemów operacyjnych może przesyłać bajty bezpośrednio z kanału źródłowego do pamięci podręcznej systemu plików bez ich kopiowania.

Sprawdź więcej na ten temat tutaj .

Uwaga : Trzecim parametrem w TransferFrom jest maksymalna liczba bajtów do przesłania. Integer.MAX_VALUEprzesyła najwyżej 2 ^ 31 bajtów, Long.MAX_VALUEpozwala na maksymalnie 2 ^ 63 bajtów (więcej niż jakikolwiek istniejący plik).

dfa
źródło
22
Zamknij wszystkie trzy za pomocą Java 7 try-with-resource: try (InputStream inputStream = website.openStream (); ReadableByteChannel readableByteChannel = Channels.newChannel (inputStream); FileOutputStream fileOutputStream = nowy FileOutputStream (outputFileName)) {fileOutputannStream. (readableByteChannel, 0, 1 << 24); }
mazatwork
80
Spowoduje to pobranie tylko pierwszych 16 MB pliku: stackoverflow.com/questions/8405062/downloading-files-with-java
Ben McCann
31
@kirdie i czy chcę więcej niż 8388608TB?
Cruncher
22
Jedno połączenie nie jest wystarczające. transferFrom()isnt ”, aby zakończyć cały transfer w jednym połączeniu. Dlatego zwraca liczbę. Musisz zapętlić.
Markiz Lorne
11
Dlaczego ta odpowiedź została w ogóle zaakceptowana? URL::openStream()zwraca tylko zwykły strumień, co oznacza, że ​​cały ruch jest nadal kopiowany przez tablice bajtów Java [] zamiast pozostać w natywnych buforach. W fos.getChannel()rzeczywistości jest to tylko kanał macierzysty, więc narzut pozostaje cały. To zero korzyści z używania NIO w tym przypadku. Oprócz zepsucia, jak słusznie zauważyli EJP i Ben MacCann.
Ext3h
494

Użyj apache commons-io , tylko jeden kod wiersza:

FileUtils.copyURLToFile(URL, File)
远 声 远 Shengyuan Lu
źródło
22
Miły! Właśnie tego szukam! Wiedziałem, że biblioteki Apache już to pokrywają. BTW, zaleca się stosowanie przeciążonej wersji z parametrami limitu czasu!
Hendy Irawan
6
... a podczas korzystania z tej przeciążonej wersji pamiętaj, że limity czasu są podawane w milisekundach, a nie sekundach.
László van den Hoek
5
Należy pamiętać, że copyURLToFileparametr timeout jest dostępny tylko od wersji 2.0 biblioteki Commons IO. Zobacz dokumenty Java
Stanley
6
co się stanie, jeśli do żądania należy dodać nagłówek podstawowego uwierzytelnienia? Czy jest w pobliżu praca?
damian
3
Chociaż jest to „krótkie”, w rzeczywistości jest bardzo wolne.
Meinkraft,
123

Prostsze użycie nio:

URL website = new URL("http://www.website.com/information.asp");
try (InputStream in = website.openStream()) {
    Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
}
Xuesheng
źródło
5
Niestety to po cichu kończy się niepowodzeniem (pobiera 0 bajtów) w przypadku przekierowania takiego jak „Znaleziono 302”.
Alexander K
1
@AlexanderK Ale dlaczego i tak ślepo pobrałbyś taki zasób?
xuesheng
5
Pomimo tego, że jest to eleganckie rozwiązanie, takie podejście może po cichu cię zdradzić. Files.copy (InputStream, Paths, FileOption) deleguje proces kopiowania do Files.copy (InputStream, OutputStream). Ta ostatnia metoda nie sprawdza końca strumienia (-1), ale sprawdza brak odczytu bajtów (0). Oznacza to, że jeśli twoja sieć miała małą przerwę, mogłaby odczytać 0 bajtów i zakończyć proces kopiowania, nawet jeśli strumień nie zostanie ukończony do pobrania przez system operacyjny.
Miere
6
@Miere Zwrócenie zera jest niemożliwe, InputStream.read()chyba że podasz bufor lub licznik o zerowej długości, „małą pauzę” lub w inny sposób. Będzie blokował się, dopóki przynajmniej jeden bajt nie zostanie przesłany, koniec strumienia lub wystąpi błąd. Twoje roszczenie dotyczące elementów wewnętrznych Files.copy()jest bezpodstawne.
Markiz Lorne
3
Mam test jednostkowy, który czyta plik binarny z 2.6TiB. Używając Files.copy, zawsze zawodzi na moim serwerze pamięci HDD (XFS), ale tylko kilka razy zawodzi mój SSH. Patrząc na JDK 8 kod File.copy stwierdziłem, że sprawdza, czy „> 0” opuszcza pętlę „while”. Właśnie skopiowałem dokładnie ten sam kod z -1 i oba testy jednostkowe nigdy się nie zatrzymały. Gdy InputStream może reprezentować deskryptory plików sieciowych i lokalnych, a obie operacje IO podlegają przełączaniu kontekstu systemu operacyjnego, nie mogę zrozumieć, dlaczego moje roszczenie jest bezpodstawne. Można twierdzić, że działa na szczęście, ale nie sprawiało już żadnych problemów.
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();
        }
    }
}

Będziesz musiał obsługiwać wyjątki, prawdopodobnie zewnętrzne dla tej metody.

Ben Noland
źródło
6
Jak pobierać bardzo szybko? Jak akcelerator pobierania?
digz6666
11
Jeśli in.closezgłasza wyjątek, fout.closenie jest wywoływany.
Beryl
1
@ComFreek To po prostu nieprawda. Użycie a BufferedInputStreamma dokładnie zerowy wpływ na przekroczenie limitu czasu gniazda. Odrzuciłem to już jako „miejski mit” w moich komentarzach do „szczegółów tła”, które zacytowałeś. 3 lata wcześniej
Markiz Lorne
@EJP Dziękujemy za korektę! Usunąłem swój komentarz (do archiwum: podłączyłem do tej odpowiedzi stwierdzając, że BufferedInputStream„może powodować nieprzewidziane awarie”).
ComFreek
+1 Moje jedyne zastrzeżenie do tej odpowiedzi (i innych tutaj) polega na tym, że osoba dzwoniąca nie może odróżnić zdarzenia „nie znaleziono” od jakiegoś błędu połączenia (na który możesz spróbować ponownie).
leonbloy
24

To stare pytanie, ale tutaj jest zwięzłe, czytelne rozwiązanie tylko dla JDK z odpowiednio zamkniętymi zasobami:

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

Dwa wiersze kodu i brak zależności.

Jan Nielsen
źródło
Dla osób, które się zastanawiają, konieczny jest import tego fragmentu kodu:import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths;
BelovedFool,
23

Pobranie pliku wymaga przeczytania go, tak czy inaczej, będziesz musiał przejść przez plik w jakiś sposób. Zamiast linii po linii możesz po prostu odczytać bajty ze strumienia:

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 -
źródło
17

Podczas korzystania Java 7+użyć metody następujące pobrać plik z Internetu i zapisać go w jakimś katalogu:

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

Dokumentacja tutaj .

BullyWiiPlaza
źródło
16

Ta odpowiedź jest prawie dokładnie tak, jak wybrana odpowiedź, ale z dwoma ulepszeniami: jest to metoda i zamyka obiekt 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();
        }
    }
Ryzyko Briana
źródło
2
Jedno połączenie nie jest wystarczające. transferFrom()isnt ”, aby zakończyć cały transfer w jednym połączeniu. Dlatego zwraca liczbę. Musisz zapętlić.
Markiz Lorne
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
źródło
5
Jeśli in.closezgłasza wyjątek, out.closenie jest wywoływany.
Beryl
8

Osobiście uważam, że HttpClient Apache'a jest więcej niż zdolny do wszystkiego, co muszę zrobić w związku z tym. Oto świetny samouczek na temat korzystania z HttpClient

belgariontking
źródło
2
także commons-io to świetna biblioteka
dfa
6

To kolejny wariant java7 oparty na odpowiedzi Briana Risk'a z użyciem instrukcji 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
źródło
Jedno połączenie nie jest wystarczające. transferFrom()isnt ”, aby zakończyć cały transfer w jednym połączeniu. Dlatego zwraca liczbę. Musisz zapętlić.
Markiz Lorne
Nie wiem, dlaczego zadajesz mi to głupie pytanie. Nie ma to nic wspólnego z tym, co powiedziałem, i naprawdę nie chcę, aby słowa wkładały mi do ust.
Markiz Lorne
2

Możliwe jest pobranie pliku za pomocą Apache HttpComponentszamiast Commons-IO. Ten kod umożliwia pobranie pliku w Javie zgodnie z jego adresem URL i zapisanie go w określonym miejscu docelowym.

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

W przeciwieństwie do pojedynczej linii kodu:

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

ten kod da ci większą kontrolę nad procesem i pozwoli ci określić nie tylko limity czasu, ale User-Agenti Refererwartości, które są kluczowe dla wielu stron internetowych.

Mike B.
źródło
2

Istnieje tutaj wiele eleganckich i skutecznych odpowiedzi. Ale zwięzłość może sprawić, że stracimy przydatne informacje. W szczególności często nie chce się uważać błędu połączenia za wyjątek i można potraktować inaczej niektóre rodzaje błędów związanych z siecią - na przykład, aby zdecydować, czy należy ponowić próbę pobrania.

Oto metoda, która nie zgłasza wyjątków dla błędów sieciowych (tylko w przypadku naprawdę wyjątkowych problemów, takich jak nieprawidłowy adres URL lub problemy z zapisywaniem do pliku)

/**
 * 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
źródło
2

Poniżej znajduje się przykładowy kod do pobrania filmu z Internetu za pomocą kodu 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
źródło
Zasadniczo odpowiedzi są o wiele bardziej pomocne, jeśli zawierają wyjaśnienie, do czego służy kod i dlaczego rozwiązuje problem bez przedstawiania innych.
Tim Diekmann
1

Występuje problem z prostym użyciem:

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

jeśli musisz pobrać i zapisać bardzo duże pliki lub ogólnie, jeśli potrzebujesz automatycznych prób w przypadku utraty połączenia.

W takich przypadkach sugeruję Apache HttpClient wraz z org.apache.commons.io.FileUtils. Na przykład:

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();
}
okej
źródło
1

Podsumowując (i jakoś dopracowując i aktualizując) poprzednie odpowiedzi. Trzy następujące metody są praktycznie równoważne. (Dodałem wyraźne limity czasu, ponieważ uważam, że są koniecznością, nikt nie chce, aby pobieranie zawieszało się na zawsze po utracie połączenia).

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

Nie widzę istotnych różnic, wszystko wydaje mi się właściwe. Są bezpieczne i wydajne. (Różnice prędkości wydają się mało istotne - zapisuję 180 MB z lokalnego serwera na dysk SSD w czasach, które wahają się w granicach od 1,2 do 1,5 seg). Nie wymagają zewnętrznych bibliotek. Wszystkie działają z dowolnymi rozmiarami i (według mojego doświadczenia) przekierowaniami HTTP.

Ponadto wszystkie rzucają, FileNotFoundExceptionjeśli zasób nie zostanie znaleziony (zwykle błąd 404), orazjava.net.UnknownHostException jeśli nie powiodło się rozstrzyganie DNS; inne wyjątki IOException odpowiadają błędom podczas transmisji.

(Oznaczone jako wiki społeczności, dodaj informacje lub poprawki)

leonbloy
źródło
1

Istnieje metoda U.fetch (url) w bibliotece podkreślenia-java .

pom.xml:

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

Przykład kodu:

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
źródło
jak przydatna jest ta odpowiedź, gdy link traci ważność? Proszę spojrzeć na Jak odpowiedzieć
JimHawkins
Twój kod nie będzie się kompilował. Zapytaj o rozwiązanie Java, ale twoja odpowiedź wygląda jakJavaScript
talex
@talex Dodałem sekcję pom.xml i ulepszyłem przykład kodu.
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
źródło
Możesz poprawić swoją odpowiedź, podając informacje o tym, jak działa Twój kod, zamiast po prostu go zrzucić.
Matej Kormuth,
0

Możesz to zrobić w 1 linii za pomocą netloader dla Java :

new NetFile(new File("my/zips/1.zip"), "https://example.com/example.zip", -1).load(); //returns true if succeed, otherwise false.
Celestyna
źródło
0

Jeśli jesteś za proxy, możesz ustawić proxy w programie Java w następujący sposób:

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

Jeśli nie jesteś za serwerem proxy, nie dołączaj powyższych wierszy do kodu. Pełny działający kod do pobrania pliku, gdy jesteś za serwerem 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
źródło
0

Pierwsza metoda przy użyciu nowego kanału

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

Druga metoda przy użyciu FileUtils

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

3. metoda przy użyciu

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

W ten sposób możemy pobrać plik za pomocą podstawowego kodu Java i innych bibliotek stron trzecich. Są to tylko dla szybkiego odniesienia. Przejdź do Google przy użyciu powyższych słów kluczowych, aby uzyskać szczegółowe informacje i inne opcje.

Ashish Gupta
źródło