Java kullanarak Internet'ten dosya nasıl indirilir ve kaydedilir?


425

Orada bir dosya (gibi http://www.example.com/information.asp) kapmak ve bir dizine kaydetmek gerekir. Çevrimiçi dosyaları (URL'leri) satır satır yakalama ve okuma için birkaç yöntem olduğunu biliyorum, ancak dosyayı Java kullanarak indirip kaydetmenin bir yolu var mı?


Yanıtlar:


559

Ver Java NIO bir deneyin:

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

Kullanımı transferFrom()ise potansiyel olarak çok daha verimli kaynak kanaldan okur ve bu kanala yazar basit bir döngü daha. Birçok işletim sistemi, gerçekte kopyalamadan baytları doğrudan kaynak kanaldan dosya sistemi önbelleğine aktarabilir.

Burada daha fazla bilgi edinin .

Not : transferFrom'daki üçüncü parametre, aktarılacak maksimum bayt sayısıdır. Integer.MAX_VALUEen fazla 2 ^ 31 bayt aktarır, en Long.MAX_VALUEfazla 2 ^ 63 bayta izin verir (varolan herhangi bir dosyadan daha büyüktür).


22
Her üçünü de Java 7 try-with-resource ile kapatın: try (InputStream inputStream = website.openStream (); ReadableByteChannel readableByteChannel = Channels.newChannel (inputStream); FileOutputStream fileOutputStream = yeni FileOutputStream (outputFileName)) {fileOutromStream (TransferFutAdı). (okunabilirByteChannel, 0, 1 << 24); }
mazatwork

80
Bu, yalnızca bir dosyanın ilk 16 MB'ını indirir: stackoverflow.com/questions/8405062/downloading-files-with-java
Ben McCann

31
@kirdie ve TB'den fazlasını istersem 8388608?
Cruncher

22
Tek bir görüşme yeterli değildir. transferFrom()aktarımın tamamını tek bir çağrıda tamamlamak için belirtilmedi. Bu yüzden bir sayı döndürüyor. Dönmelisin.
Lorne Marquis

11
Bu cevap neden kabul edildi? URL::openStream()yalnızca normal bir akış döndürür, yani tüm trafik, yerel arabelleklerde kalmak yerine Java bayt [] dizileri aracılığıyla kopyalanmaya devam eder. Yalnızca fos.getChannel()yerel bir kanaldır, bu nedenle ek yük tam olarak kalır. Bu durumda NIO kullanmanın sıfır kazancı budur. EJP ve Ben MacCann'ın doğru bir şekilde fark ettiği gibi kırılmanın dışında.
Ext3h

494

Apache commons-io , sadece bir satır kodu kullanın:

FileUtils.copyURLToFile(URL, File)

22
Güzel! Tam aradığım şey! Apache kütüphanelerinin bunu zaten kapsayacağını biliyordum. BTW, aşırı yüklenmiş sürümü zaman aşımı parametreleriyle kullanmanız önerilir!
Hendy Irawan

6
... ve aşırı yüklenmiş sürümü kullanırken, zaman aşımlarının saniye değil milisaniye cinsinden belirtildiğini unutmayın.
László van den Hoek

5
copyURLToFileZaman aşımı parametresiyle yalnızca Commons IO kitaplığının 2.0 sürümünden beri kullanılabildiğini unutmayın . Java belgelerine
Stanley

6
isteğe temel kimlik doğrulama üstbilgisi eklenmesi gerekiyorsa ne olur? bir çözüm var mı?
damian

3
Bu "kısa" olmasına rağmen, aslında çok yavaş.
Meinkraft

123

Daha basit nio kullanımı:

URL website = new URL("http://www.website.com/information.asp");
try (InputStream in = website.openStream()) {
    Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
}

5
Ne yazık ki bu "302 Bulundu" gibi bir yönlendirme olması durumunda sessizce başarısız olur (0 bayt indirir).
Alexander K

1
@AlexanderK Ama neden böyle bir kaynağı körü körüne indiresin ki?
xuesheng

5
Bu zarif bir çözüm olmasına rağmen, bu yaklaşımın arkasında bu yaklaşım size sessizce ihanet edebilir. Files.copy (InputStream, Paths, FileOption) kopyalama işlemini Files.copy'ye (InputStream, OutputStream) aktarır. Bu son yöntem akımın (-1) sonunu kontrol etmez, ancak bayt okumayı (0) kontrol eder. Bu, ağınızda biraz duraklama olursa akışın işletim sistemi tarafından indirilmesi bitmemiş olsa bile 0 bayt okuyabilir ve kopyalama işlemini sonlandırabileceği anlamına gelir.
Miere

6
@Miere InputStream.read()Sıfır uzunluklu bir tampon veya sayım, 'az duraklama' veya başka bir değer sağlamadığınız sürece sıfır döndürmek mümkün değildir . En az bir bayt aktarılana veya akışın sonuna veya bir hata oluşana kadar bloke olur. İçindekiler hakkındaki iddianız Files.copy()temelsizdir.
Lorne Markiz

3
2.6TiB ile ikili bir dosyayı okuyan bir birim sınaması var. Files.copy kullanarak HDD depolama sunucumda (XFS) her zaman başarısız olur, ancak SSH sunucumun yalnızca birkaç katı başarısız olur. JDK 8'e bakarken File.copy kodunu '> 0' olup olmadığını 'while' döngüsünde bırakıp bırakmadığını kontrol ettim. Sadece aynı kodu -1 ile kopyaladım ve her iki birim testi de bir daha durmadı. InputStream, Ağ ve yerel dosya tanımlayıcılarını temsil edebildiğinde ve her iki GÇ işlemi de OS bağlam anahtarlamasına tabi olduğunda, iddiamın neden temelsiz olduğunu anlayamıyorum. Kişi şansla çalıştığını iddia edebilir, ancak artık baş ağrısı vermedi.
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();
        }
    }
}

Muhtemelen bu yöntemin dışında olan istisnaları ele almanız gerekir.


6
Çok daha hızlı nasıl indirilir? İndirme hızlandırıcısı gibi mi?
digz6666

11
Bir in.closeistisna atarsa, fout.closeçağrılmaz.
Berilyum

1
@ComFreek Bu sadece doğru değil. A kullanıldığında BufferedInputStreamsoket zaman aşımlarında kesin sıfır etkisi olur. Alıntı yaptığım 'arka plan detayları' için yaptığım yorumlarda bunu 'kentsel mit' olarak çürütmüştüm. Üç yıl önce.
Lorne Marquis

@EJP Düzeltme için teşekkürler! Yorumumu kaldırdım (arşiv için: "öngörülemeyen hatalara neden olabileceğini " belirten bu cevaba bağlandım BufferedInputStream).
ComFreek

+1 Bu yanıta (ve buradaki diğer kullanıcılara) karşı tek itirazım, arayanın "bulunamadı" olayını bazı bağlantı hatalarından (yeniden denemek isteyebileceğiniz) ayırt edememesidir.
leonbloy

24

Bu eski bir soru ama burada düzgün bir şekilde kapatılmış kaynaklara sahip kısa, okunabilir, sadece JDK'ya özel bir çözüm var:

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

İki kod satırı ve bağımlılık yok.


Merak eden insanlar için, bu kod snippet'i için gereken ithalat şunlardır:import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths;
BelovedFool

23

Bir dosyayı indirmek, dosyayı okumanızı gerektirir; her iki durumda da dosyaya bir şekilde geçmeniz gerekir. Satır satır satır yerine, akıştan bayt olarak okuyabilirsiniz:

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

17

Kullanırken Java 7+İnternet'ten bir dosya indirmek ve bir dizine kaydetmek için aşağıdaki yöntemi kullanın:

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

Belgeler burada .


16

Bu yanıt neredeyse tam olarak seçilen yanıta benzer, ancak iki geliştirmeyle: bu bir yöntemdir ve FileOutputStream nesnesini kapatır:

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

2
Tek bir görüşme yeterli değildir. transferFrom()aktarımın tamamını tek bir çağrıda tamamlamak için belirtilmedi. Bu yüzden bir sayı döndürüyor. Dönmelisin.
Lorne Markiz

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

5
Bir in.closeistisna atarsa, out.closeçağrılmaz.
Berilyum


6

Bu, Brian Risk'in try-with ifadesinin kullanımı ile verdiği cevaba dayanan başka bir java7 varyantıdır :

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

  }

Tek bir görüşme yeterli değildir. transferFrom()aktarımın tamamını tek bir çağrıda tamamlamak için belirtilmedi. Bu yüzden bir sayı döndürüyor. Dönmelisin.
Lorne Markiz

O aptal soruyu neden bana yönelttiğini bilmiyorum. Söylediklerimle bir ilgisi yok ve gerçekten ağzımın içine kelimeler koymayı reddediyorum.
Lorne Marquis

2

Dosyayı HttpComponentsbunun yerine Apache ile indirmek mümkündür Commons-IO. Bu kod, Java'daki bir dosyayı URL'sine göre indirmenize ve belirli bir hedefe kaydetmenize olanak tanır.

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

Tek kod satırının aksine:

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

Bu kod, bir işlemi üzerinde daha fazla kontrol elde ve zaman çıkışları sadece o değil belirtmek sağlayacak User-Agentve Refererbirçok web-siteleri için kritik olan değerler.


2

Burada birçok zarif ve etkili cevap var. Ancak kısa ve öz, bazı yararlı bilgileri kaybetmemize neden olabilir. Özellikle, çoğu zaman bir bağlantı hatasını bir İstisna olarak değerlendirmek istemez ve biri ağ ile ilgili bir çeşit farklı davranmak isteyebilir - örneğin, indirmeyi tekrar denememiz gerekip gerekmediğine karar vermek için.

Ağ hataları için İstisnalar atmayan bir yöntem (sadece hatalı biçimlendirilmiş URL veya dosyaya yazma sorunları gibi gerçekten istisnai sorunlar için)

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

2

Java kodu ile internetten film indirmek için örnek kod aşağıdadır:

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

Genellikle, kodun ne yapması gerektiği ve başkalarını tanıtmadan sorunu neden çözdüğüne dair bir açıklama içeriyorsa, yanıtlar çok daha yararlıdır.
Tim Diekmann

1

Aşağıdakilerin basit kullanımıyla ilgili bir sorun var:

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

çok büyük dosyaları indirmeniz ve kaydetmeniz gerekiyorsa veya genel olarak bağlantının kesilmesi durumunda otomatik yeniden denemeler gerekiyorsa.

Bu gibi durumlarda önerdiğim orache.apache.commons.io.FileUtils ile birlikte Apache HttpClient. Örneğin:

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

1

Önceki cevapları özetlemek (ve bir şekilde cilalamak ve güncellemek). Aşağıdaki üç yöntem pratik olarak eşdeğerdir. (Açık zaman aşımları ekledim, çünkü bunların bir zorunluluk olduğunu düşünüyorum, kimse bağlantı kesildiğinde bir indirme işleminin sonsuza kadar donmasını istemiyor.)

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

Önemli farklılıklar bulamıyorum, hepsi benim için doğru görünüyor. Güvenli ve verimlidirler. (Hız farkları pek alakalı görünmüyor - yerel sunucudan bir SSD diskine yaklaşık 1.2 ila 1.5 seg dalgalanan zamanlarda 180Mb yazıyorum). Harici kütüphanelere ihtiyaç duymazlar. Tümü keyfi boyutlarda ve (deneyimime göre) HTTP yeniden yönlendirmeleriyle çalışır.

Buna ek olarak, FileNotFoundExceptionkaynak bulunamazsa (genellikle 404 hatası) ve java.net.UnknownHostExceptionDNS çözümlemesi başarısız olursa tümü atar ; diğer IOException iletim sırasındaki hatalara karşılık gelir.

(Topluluk wiki'si olarak işaretlendi, bilgi veya düzeltme eklemekten çekinmeyin)


1

Alt çizgi-java kütüphanesinde U.fetch (url) yöntemi vardır .

pom.xml:

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

Kod örneği:

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

bağlantı geçersiz olduğunda bu cevap ne kadar yararlıdır? Lütfen nasıl cevap
vereceğinize bakınız

Kodunuz derlenmeyecek. Soru içinde çözüm için sormak Javagibi, ama cevap bakmakJavaScript
TAlex

@talex pom.xml bölümünü ekledim ve kod örneğini geliştirdim.
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;
    }
}

Kodunuzu sadece boşaltmak yerine nasıl çalıştığına dair bilgi sağlayarak yanıtınızı geliştirebilirsiniz.
Matej Kormuth

0

Java için netloader'ı kullanarak bunu 1 satırda yapabilirsiniz :

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

0

Proxy'nin arkasındaysanız, java programındaki proxy'leri aşağıdaki gibi ayarlayabilirsiniz:

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

Proxy'nin arkasında değilseniz, kodunuza yukarıdaki satırları eklemeyin. Proxy arkasındayken bir dosyayı indirmek için tam çalışma kodu.

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

0

Yeni kanalı kullanarak 1. Yöntem

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

FileUtils kullanarak 2. yöntem

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

Kullanarak 3. Yöntem

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

Temel java kodunu ve diğer üçüncü taraf kütüphanelerini kullanarak dosyayı bu şekilde indirebiliriz. Bunlar sadece hızlı referans içindir. Ayrıntılı bilgi ve diğer seçenekler için lütfen yukarıdaki anahtar kelimelerle google.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.