Bagaimana cara mengunduh dan menyimpan file dari Internet menggunakan Java?

425

Ada file online (seperti http://www.example.com/information.asp) yang perlu saya ambil dan simpan ke direktori. Saya tahu ada beberapa metode untuk mengambil dan membaca file online (URL) baris-demi-baris, tetapi apakah ada cara untuk mengunduh dan menyimpan file menggunakan Java?

echoblaze
sumber

Jawaban:

560

Berikan Java NIO mencoba:

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

Menggunakan transferFrom()ini berpotensi jauh lebih efisien daripada loop sederhana yang membaca dari saluran sumber dan menulis untuk saluran ini. Banyak sistem operasi dapat mentransfer byte langsung dari saluran sumber ke cache sistem file tanpa benar-benar menyalinnya.

Lihat lebih lanjut di sini .

Catatan : Parameter ketiga dalam transferFrom adalah jumlah byte maksimum untuk ditransfer. Integer.MAX_VALUEakan mentransfer paling banyak 2 ^ 31 byte, Long.MAX_VALUEakan memungkinkan paling banyak 2 ^ 63 byte (lebih besar dari file apa pun yang ada).

dfa
sumber
22
Tutup ketiganya dengan Java 7 try-with-resource: try (InputStream inputStream = website.openStream (); ReadableByteChannel readableByteChannel = Channels.newChannel (inputStream); FileOutputStream fileOutputStream = new FileOutputStream (outputFileNama) file) { (readableByteChannel, 0, 1 << 24); }
mazatwork
80
Ini hanya akan mengunduh 16MB file pertama: stackoverflow.com/questions/8405062/downloading-files-with-java
Ben McCann
31
@ kirdie dan jika saya ingin lebih dari 8388608TB?
Cruncher
22
Panggilan tunggal tidak memadai. transferFrom()tidak ditentukan untuk menyelesaikan seluruh transfer dalam satu panggilan. Itu sebabnya ia mengembalikan hitungan. Anda harus mengulang.
Marquis of Lorne
11
Mengapa jawaban ini bahkan diterima? URL::openStream()mengembalikan hanya aliran biasa, artinya seluruh lalu lintas masih sedang disalin melalui array Java byte [] alih-alih tetap di buffer asli. Hanya fos.getChannel()sebenarnya saluran asli, sehingga overhead tetap penuh. Itu nol keuntungan dari menggunakan NIO dalam kasus ini. Selain rusak, seperti yang EJP dan Ben MacCann perhatikan dengan benar.
Ext3h
495

Gunakan apache commons-io , hanya satu kode baris:

FileUtils.copyURLToFile(URL, File)
卢 声 远 Shengyuan Lu
sumber
22
Bagus! Apa yang saya cari! Saya tahu perpustakaan Apache sudah membahas hal ini. BTW, disarankan untuk menggunakan versi overload dengan parameter batas waktu!
Hendy Irawan
6
... dan ketika menggunakan versi kelebihan beban itu, ingatlah bahwa batas waktu ditentukan dalam milidetik, bukan detik.
László van den Hoek
5
Perhatikan bahwa copyURLToFiledengan parameter batas waktu hanya tersedia sejak versi 2.0 dari perpustakaan Commons IO. Lihat dokumen Java
Stanley
6
bagaimana jika header otentikasi dasar harus ditambahkan ke permintaan? apakah ada solusinya?
Damian
3
Meskipun ini "pendek", sebenarnya sangat lambat.
Meinkraft
123

Penggunaan nio yang lebih sederhana:

URL website = new URL("http://www.website.com/information.asp");
try (InputStream in = website.openStream()) {
    Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
}
xuesheng
sumber
5
Sayangnya ini gagal secara diam-diam (unduh 0 byte) jika ada pengalihan seperti "302 Ditemukan".
Alexander K
1
@AlexanderK Tapi mengapa Anda membabi buta mengunduh sumber daya seperti itu?
xuesheng
5
Terlepas dari kenyataan bahwa ini adalah solusi yang elegan, di balik layar pendekatan ini diam-diam bisa mengkhianati Anda. Files.copy (InputStream, Paths, FileOption) mendelegasikan proses penyalinan ke Files.copy (InputStream, OutputStream). Metode terakhir ini tidak memeriksa akhir aliran (-1) tetapi memeriksa tanpa byte baca (0). Ini berarti bahwa, jika jaringan Anda memiliki jeda sedikit, itu bisa membaca 0 byte dan mengakhiri proses penyalinan, bahkan jika aliran belum selesai diunduh oleh OS.
Miere
6
@Miere Tidak mungkin untuk InputStream.read()mengembalikan nol kecuali Anda memberikan buffer panjang nol atau menghitung, 'jeda sedikit' atau sebaliknya. Itu akan memblokir hingga setidaknya satu byte telah ditransfer atau akhir aliran atau kesalahan terjadi. Klaim Anda tentang masalah internal Files.copy()tidak berdasar.
Marquis of Lorne
3
Saya memiliki unit test yang membaca file biner dengan 2.6TiB. Menggunakan Files.copy selalu gagal pada server penyimpanan HDD saya (XFS) tetapi gagal hanya beberapa kali SSH saya. Melihat JDK 8 kode dari File.copy saya telah mengidentifikasi bahwa ia memeriksa '> 0' untuk meninggalkan loop 'while'. Saya baru saja menyalin kode yang persis sama dengan -1 dan kedua unit test tidak pernah berhenti lagi. Setelah InputStream dapat mewakili Network dan deskriptor file lokal, dan kedua operasi IO tunduk pada pengalihan konteks OS, saya tidak dapat melihat mengapa klaim saya tidak berdasar. Seseorang mungkin mengklaim itu bekerja karena keberuntungan, tetapi itu tidak membuat sakit kepala lagi.
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();
        }
    }
}

Anda harus menangani pengecualian, mungkin eksternal dari metode ini.

Ben Noland
sumber
6
Bagaimana cara mengunduh sangat cepat? Suka mengunduh akselerator?
digz6666
11
Jika in.closemelempar pengecualian, fout.closetidak dipanggil.
Berilium
1
@ComFreek Itu tidak benar. Menggunakan BufferedInputStreamefek nol pada timeout soket. Saya sudah membantahnya sebagai 'mitos urban' dalam komentar saya pada 'detail latar belakang' yang Anda kutip. Tiga tahun sebelumnya.
Marquis of Lorne
@ EJP Terima kasih atas koreksinya! Saya menghapus komentar saya (untuk arsip: Saya menautkan ke jawaban ini yang menyatakan bahwa BufferedInputStream"dapat menyebabkan kegagalan yang tidak terduga").
ComFreek
+1 Satu-satunya keberatan saya atas jawaban ini (dan yang lainnya di sini) adalah bahwa penelepon tidak dapat membedakan acara "tidak ditemukan" dari beberapa kesalahan koneksi (yang mungkin ingin Anda coba lagi).
leonbloy
24

Ini adalah pertanyaan lama tapi di sini ada solusi JDK yang ringkas, mudah dibaca, dan hanya dengan sumber daya yang ditutup dengan benar:

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

Dua baris kode dan tidak ada dependensi.

Jan Nielsen
sumber
Untuk orang-orang yang bertanya-tanya, berikut adalah impor yang diperlukan untuk cuplikan kode ini:import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths;
BelovedFool
23

Mengunduh file mengharuskan Anda membacanya, dengan cara apa pun Anda harus membaca file dengan cara apa pun. Alih-alih baris demi baris, Anda bisa membacanya dengan byte dari aliran:

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 -
sumber
17

Saat menggunakan Java 7+gunakan metode berikut untuk mengunduh file dari Internet dan menyimpannya ke beberapa direktori:

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

Dokumentasi di sini .

BullyWiiPlaza
sumber
16

Jawaban ini hampir persis seperti jawaban yang dipilih tetapi dengan dua perangkat tambahan: ini adalah metode dan menutup objek 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
sumber
2
Panggilan tunggal tidak memadai. transferFrom()tidak ditentukan untuk menyelesaikan seluruh transfer dalam satu panggilan. Itu sebabnya ia mengembalikan hitungan. Anda harus mengulang.
Marquis of 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
sumber
5
Jika in.closemelempar pengecualian, out.closetidak dipanggil.
Berilium
8

Secara pribadi, saya menemukan HttpClient Apache lebih dari mampu melakukan semua yang saya perlu lakukan sehubungan dengan ini. Ini adalah tutorial yang bagus untuk menggunakan HttpClient

belgariontheking
sumber
2
juga commons-io adalah perpustakaan yang bagus
dfa
6

Ini adalah varian java7 lain berdasarkan jawaban Brian Risk dengan penggunaan pernyataan coba-dengan:

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
sumber
Panggilan tunggal tidak memadai. transferFrom()tidak ditentukan untuk menyelesaikan seluruh transfer dalam satu panggilan. Itu sebabnya ia mengembalikan hitungan. Anda harus mengulang.
Marquis of Lorne
Saya tidak tahu mengapa Anda menjawab pertanyaan bodoh itu kepada saya. Itu tidak ada hubungannya dengan apa yang saya katakan, dan saya benar-benar menolak untuk memasukkan kata-kata ke dalam mulut saya.
Marquis of Lorne
2

Mungkin untuk mengunduh file dengan menggunakan Apache, HttpComponentsbukan Commons-IO. Kode ini memungkinkan Anda untuk mengunduh file di Jawa sesuai dengan URL-nya dan menyimpannya di tujuan tertentu.

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

Berbeda dengan satu baris kode:

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

kode ini akan memberi Anda lebih banyak kontrol atas suatu proses dan memungkinkan Anda menentukan tidak hanya waktu menyendiri tetapi User-Agentdan Referernilai - nilai, yang sangat penting bagi banyak situs web.

Mike B.
sumber
2

Ada banyak jawaban yang elegan dan efisien di sini. Tetapi keringkasan ini dapat membuat kita kehilangan beberapa informasi yang bermanfaat. Secara khusus, orang sering tidak ingin menganggap kesalahan koneksi sebagai Pengecualian , dan orang mungkin ingin memperlakukan secara berbeda beberapa jenis kesalahan terkait jaringan - misalnya, untuk memutuskan apakah kami harus mencoba ulang unduhan.

Berikut adalah metode yang tidak membuang Pengecualian untuk kesalahan jaringan (hanya untuk masalah yang benar-benar luar biasa, seperti url yang salah format atau masalah menulis ke file)

/**
 * 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
sumber
2

Di bawah ini adalah contoh kode untuk mengunduh film dari internet dengan kode 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
sumber
Secara umum, jawaban akan jauh lebih membantu jika mereka menyertakan penjelasan tentang apa yang dimaksudkan untuk dilakukan oleh kode, dan mengapa hal itu menyelesaikan masalah tanpa memperkenalkan orang lain.
Tim Diekmann
1

Ada masalah dengan penggunaan sederhana:

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

jika Anda perlu mengunduh dan menyimpan file yang sangat besar, atau secara umum jika Anda perlu mencoba ulang otomatis jika koneksi terputus.

Apa yang saya sarankan dalam kasus tersebut adalah Apache HttpClient bersama dengan org.apache.commons.io.FileUtils. Sebagai contoh:

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
sumber
1

Untuk meringkas (dan entah bagaimana memoles dan memperbarui) jawaban sebelumnya. Tiga metode berikut ini praktis setara. (Saya menambahkan batas waktu eksplisit karena saya pikir itu adalah keharusan, tidak ada yang mau unduhan dibekukan selamanya ketika koneksi terputus.)

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

Saya tidak menemukan perbedaan yang signifikan, semuanya tampak benar bagi saya. Mereka aman dan efisien. (Perbedaan kecepatan tampaknya hampir tidak relevan - saya menulis 180MB dari server lokal ke disk SSD pada waktu yang berfluktuasi sekitar 1,2 hingga 1,5 seg). Mereka tidak memerlukan perpustakaan eksternal. Semua bekerja dengan ukuran sewenang-wenang dan (untuk pengalaman saya) pengalihan HTTP.

Selain itu, semua melempar FileNotFoundExceptionjika sumber daya tidak ditemukan (kesalahan 404, biasanya), danjava.net.UnknownHostException jika resolusi DNS gagal; IOException lainnya berhubungan dengan kesalahan selama transmisi.

(Ditandai sebagai komunitas wiki, silakan tambahkan info atau koreksi)

leonbloy
sumber
1

Ada metode U.fetch (url) di underscore-java perpustakaan .

pom.xml:

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

Contoh kode:

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
sumber
seberapa bermanfaat jawaban ini, ketika tautannya menjadi tidak valid? Silakan lihat Cara Menjawab
JimHawkins
Kode Anda tidak akan dikompilasi. Pertanyaan meminta solusi Java, tetapi jawaban Anda terlihat sepertiJavaScript
talex
@talex Saya menambahkan bagian pom.xml dan contoh kode ditingkatkan.
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
sumber
Anda dapat meningkatkan jawaban Anda dengan memberikan informasi bagaimana kode Anda bekerja dan bukan hanya membuangnya.
Matej Kormuth
0

Anda dapat melakukan ini dalam 1 baris menggunakan netloader untuk Java :

new NetFile(new File("my/zips/1.zip"), "https://example.com/example.zip", -1).load(); //returns true if succeed, otherwise false.
Celestine
sumber
0

Jika Anda berada di belakang proxy, Anda dapat mengatur proksi dalam program java seperti di bawah ini:

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

Jika Anda tidak berada di belakang proxy, jangan sertakan baris di atas dalam kode Anda. Kode kerja penuh untuk mengunduh file saat Anda berada di belakang 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
sumber
0

Metode 1 menggunakan saluran baru

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

Metode 2 menggunakan FileUtils

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

Metode 3 menggunakan

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

Ini adalah bagaimana kita dapat mengunduh file dengan menggunakan kode java dasar dan perpustakaan pihak ketiga lainnya. Ini hanya untuk referensi cepat. Silakan google dengan kata kunci di atas untuk mendapatkan informasi rinci dan opsi lainnya.

Ashish Gupta
sumber