जावा का उपयोग करके इंटरनेट से किसी फ़ाइल को कैसे डाउनलोड और सहेजना है?


425

एक ऑनलाइन फ़ाइल है (जैसे http://www.example.com/information.asp) मुझे निर्देशिका को हथियाने और सहेजने की आवश्यकता है। मुझे पता है कि लाइन-बाय-लाइन ऑनलाइन फ़ाइलों (URL) को हथियाने और पढ़ने के लिए कई तरीके हैं, लेकिन क्या जावा का उपयोग करके फ़ाइल को बस डाउनलोड करने और सहेजने का एक तरीका है?


जवाबों:


559

दे दो जावा 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);

का उपयोग करना transferFrom()है संभवतः ज्यादा एक सरल पाश है कि स्रोत चैनल से पढ़ता है और इस चैनल में लिखते हैं की तुलना में अधिक कुशल। कई ऑपरेटिंग सिस्टम वास्तव में कॉपी किए बिना फाइल सिस्टम कैश में स्रोत चैनल से सीधे बाइट्स को स्थानांतरित कर सकते हैं।

इसके बारे में अधिक यहां देखें

नोट : TransferFrom में तीसरा पैरामीटर स्थानांतरण के लिए बाइट्स की अधिकतम संख्या है। Integer.MAX_VALUEअधिकांश 2 ^ 31 बाइट्स में स्थानांतरण Long.MAX_VALUEकरेगा, अधिकतम 2 ^ 63 बाइट्स (अस्तित्व में किसी भी फ़ाइल से बड़ा) पर अनुमति देगा।


22
Java 7 try-with-resource के साथ तीनों को बंद करें: try (InputStream inputStream = website.openStream (); ReadableByteChannel readableByteChannel = Channels.newChannel (inputStream); FileOutputStream fileOutputStream = new FileOutputStream (output -Name) (readableByteChannel, 0, 1 << 24); }
mazatwork

80
यह केवल एक फ़ाइल का पहला 16MB डाउनलोड करेगा: stackoverflow.com/questions/8405062/downloading-files-with-java
बेन मैककैन

31
@ कीर्ति और अगर मुझे 8388608टीबी से अधिक चाहिए ?
क्रंचर

22
एक भी कॉल पर्याप्त नहीं है। transferFrom()एक ही कॉल में पूरे हस्तांतरण को पूरा करने के लिए निर्दिष्ट नहीं किया गया। इसलिए यह एक गिनती लौटाता है। आपको लूप करना है।
लोर्न

11
इस उत्तर को भी क्यों स्वीकार किया गया? URL::openStream()सिर्फ एक नियमित स्ट्रीम देता है, जिसका अर्थ है कि संपूर्ण ट्रैफ़िक अभी भी जावा बाइट के माध्यम से कॉपी किया जा रहा है [] बफ़र देशी बफ़र्स में शेष रहने के बजाय। केवल fos.getChannel()वास्तव में एक देशी चैनल है, इसलिए ओवरहेड पूर्ण रूप से बना हुआ है। इस मामले में NIO का उपयोग करने से शून्य लाभ होता है। टूटने के अलावा, ईजेपी और बेन मैककैन ने सही रूप से देखा।
Ext3h

494

Apache commons-io का उपयोग करें , बस एक पंक्ति कोड:

FileUtils.copyURLToFile(URL, File)

22
अच्छा! बस मैं क्या देख रहा हूँ! मुझे पता था कि अपाचे पुस्तकालय इसे पहले ही कवर कर लेंगे। BTW, यह टाइमआउट मापदंडों के साथ अतिभारित संस्करण का उपयोग करने के लिए अनुशंसित है!
हेंडी इरावन

6
... और जब उस अतिभारित संस्करण का उपयोग करते हैं, तो याद रखें कि समय-सीमा मिलीसेकंड में निर्दिष्ट हैं, सेकंड नहीं।
लेज़्ज़्लो वैन डेन होके

5
ध्यान रखें कि copyURLToFileटाइमआउट पैरामीटर केवल कॉमन्स IO लाइब्रेरी के संस्करण 2.0 के बाद से उपलब्ध है। जावा डॉक्स
स्टेनली

6
क्या होगा यदि मूल प्रमाणीकरण शीर्षलेख को अनुरोध में जोड़ा जाना है? क्या आसपास कोई काम है?
डेमियन

3
हालांकि यह "छोटा" है, यह वास्तव में बहुत धीमा है।
मेकक्राफ्ट

123

सरल nio उपयोग:

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

5
दुर्भाग्य से यह चुपचाप विफल रहता है (0 बाइट्स डाउनलोड करता है) अगर कोई रीडायरेक्ट है जैसे "302 फाउंड"।
अलेक्जेंडर के

1
@AlexanderK लेकिन आप वैसे भी आँख बंद करके इस तरह के संसाधन को क्यों डाउनलोड करेंगे?
xuesheng

5
इस तथ्य के बावजूद कि यह एक सुंदर समाधान है, पर्दे के पीछे यह दृष्टिकोण आपको चुपचाप धोखा दे सकता है। Files.copy (InputStream, Paths, FileOption) कॉपी प्रोसेस को Files.copy (InputStream, OutputStream) को सौंपता है। यह अंतिम विधि धारा के अंत के लिए जांच नहीं करता है (-1) लेकिन बिना किसी बाइट के लिए जाँच करता है (0)। इसका मतलब यह है कि, यदि आपके नेटवर्क में थोड़ी सी भी गड़बड़ी है, तो यह 0 बाइट्स पढ़ सकता है और प्रतिलिपि प्रक्रिया को समाप्त कर सकता है, भले ही धारा ओएस द्वारा डाउनलोड करने के लिए समाप्त न हो।
Miere

6
InputStream.read()जब तक आपने शून्य लंबाई बफर या गिनती, 'थोड़ा विराम' या अन्यथा प्रदान नहीं किया, तब तक शून्य पर लौटना असंभव है । यह तब तक ब्लॉक रहेगा जब तक कम से कम एक बाइट को स्थानांतरित नहीं किया जाता है या स्ट्रीम का अंत नहीं होता है या कोई त्रुटि होती है। के आंतरिक के बारे में आपका दावा Files.copy()निराधार है।
लोर्ने

3
मेरे पास एक इकाई परीक्षण है जो 2.6TiB के साथ एक बाइनरी फ़ाइल पढ़ता है। Files.copy का उपयोग करना यह हमेशा मेरे HDD स्टोरेज सर्वर (XFS) पर विफल रहता है, लेकिन यह मेरे SSH के कुछ ही बार विफल होता है। JDK 8 को File.copy के कोड को देखकर मैंने पहचाना है कि यह '> 0' के लिए चेक करता है जबकि 'लूप' छोड़ता है। मैंने सिर्फ -1 के साथ ठीक उसी कोड को कॉपी किया है और दोनों यूनिट परीक्षण फिर कभी नहीं रुके। एक बार जब इनपुटस्ट्रीम नेटवर्क और स्थानीय फ़ाइल डिस्क्रिप्टर का प्रतिनिधित्व कर सकता है, और दोनों आईओ ऑपरेशन ओएस संदर्भ स्विचिंग के अधीन हैं, तो मैं देख सकता हूं कि मेरा दावा क्यों निराधार है। कोई यह दावा कर सकता है कि यह भाग्य से काम कर रहा है, लेकिन इसने कोई सिरदर्द नहीं दिया।
मीर

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

आपको अपवादों को संभालने की आवश्यकता होगी, शायद इस विधि के लिए बाहरी।


6
बहुत तेजी से कैसे डाउनलोड करें? डाउनलोड त्वरक की तरह?
digz6666

11
यदि in.closeएक अपवाद फेंकता है, fout.closeतो नहीं कहा जाता है।
बेरिलियम

1
@ कॉम यह केवल असत्य है। BufferedInputStreamसॉकेट टाइमआउट पर सटीक शून्य प्रभाव का उपयोग करना । मैंने पहले ही मना कर दिया कि 'शहरी विवरण' के रूप में मेरी टिप्पणियों में 'पृष्ठभूमि का विवरण' है। तीन साल पहले।
लोर्न

@EJP सुधार के लिए धन्यवाद! मैंने अपनी टिप्पणी (संग्रह के लिए: मैंने इस उत्तर से यह कहते हुए जोड़ दी कि BufferedInputStream"अप्रत्याशित असफलताएँ हो सकती हैं")।
कॉमफ्रीक

+1 इस उत्तर पर (और अन्य लोगों के लिए) मेरी एकमात्र आपत्ति यह है कि कॉलर कुछ कनेक्शन त्रुटि (जिस पर आप पुनः प्रयास करना चाहते हैं) से "नहीं मिली" घटना को अलग नहीं कर सकते।
leonbloy

24

यह एक पुराना सवाल है, लेकिन यहाँ एक संक्षिप्त, पठनीय, JDK- केवल उचित रूप से बंद संसाधनों के साथ समाधान है:

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

कोड की दो लाइनें और कोई निर्भरता नहीं।


सोच रहे लोगों के लिए, यहाँ इस कोड के स्निपेट के लिए आवश्यक आयात हैं:import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths;
BelovedFool

23

किसी फ़ाइल को डाउनलोड करने के लिए आपको इसे पढ़ना होगा, किसी भी तरह से आपको किसी तरह फ़ाइल से गुजरना होगा। लाइन से लाइन के बजाय, आप इसे स्ट्रीम से बाइट्स द्वारा पढ़ सकते हैं:

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

Java 7+इंटरनेट से फ़ाइल डाउनलोड करने और इसे कुछ निर्देशिका में सहेजने के लिए निम्न विधि का उपयोग करते समय:

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

यहाँ प्रलेखन ।


16

यह उत्तर लगभग चयनित उत्तर की तरह है लेकिन दो संवर्द्धन के साथ: यह एक विधि है और यह 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();
        }
    }

2
एक भी कॉल पर्याप्त नहीं है। transferFrom()एक ही कॉल में पूरे हस्तांतरण को पूरा करने के लिए निर्दिष्ट नहीं किया गया। इसलिए यह एक गिनती लौटाता है। आपको लूप करना है।
लोर्न

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
यदि in.closeएक अपवाद फेंकता है, out.closeतो नहीं कहा जाता है।
बेरिलियम

8

व्यक्तिगत रूप से, मैंने अपाचे के HttpClient को इस संबंध में जो कुछ भी करने की आवश्यकता है, उससे अधिक सक्षम होने के लिए पाया है । यहाँ HttpClient का उपयोग करने पर एक महान ट्यूटोरियल है


2
commons-io एक महान पुस्तकालय है
dfa

6

यह ब्रायन रिस्क के उत्तर पर आधारित प्रयास के उपयोग के साथ एक और java7 संस्करण है :

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

  }

एक भी कॉल पर्याप्त नहीं है। transferFrom()एक ही कॉल में पूरे हस्तांतरण को पूरा करने के लिए निर्दिष्ट नहीं किया गया। इसलिए यह एक गिनती लौटाता है। आपको लूप करना है।
लोर्न

मुझे नहीं पता कि आप मुझे उस बेवकूफ सवाल को क्यों संबोधित कर रहे हैं। इसका मेरे द्वारा कही गई बातों से कोई लेना-देना नहीं है, और मैं वास्तव में मेरे मुंह में डाल दिए गए शब्दों को अस्वीकार करता हूं।
लोर्न

2

अपाचे के साथ फ़ाइल को डाउनलोड करना संभव है HttpComponentsइसके बजाय Commons-IO। यह कोड आपको इसके URL के अनुसार जावा में एक फ़ाइल डाउनलोड करने और इसे विशिष्ट गंतव्य पर सहेजने की अनुमति देता है।

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

कोड की एकल पंक्ति के विपरीत:

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

इस कोड को आप एक प्रक्रिया पर अधिक नियंत्रण दे और आप न केवल समय बहिष्कार लेकिन निर्दिष्ट करने देगा User-Agentऔर Refererमूल्यों है, जो कई वेब साइटों के लिए महत्वपूर्ण हैं।


2

यहां कई सुरुचिपूर्ण और कुशल उत्तर हैं। लेकिन संक्षिप्तता हमें कुछ उपयोगी जानकारी खो सकती है। विशेष रूप से, कोई अक्सर कनेक्शन त्रुटि को अपवाद नहीं मानना ​​चाहता है , और कोई भिन्न प्रकार की नेटवर्क-संबंधी त्रुटियों का इलाज करना चाहता है - उदाहरण के लिए, यह तय करने के लिए कि क्या हमें डाउनलोड का पुनः प्रयास करना चाहिए।

यहां एक विधि है जो नेटवर्क त्रुटियों के लिए अपवाद नहीं फेंकती है (केवल वास्तव में असाधारण समस्याओं के लिए, विकृत यूआरएल या फ़ाइल में लिखने की समस्या के रूप में)

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

नीचे जावा कोड के साथ इंटरनेट से मूवी डाउनलोड करने का नमूना कोड है:

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

आम तौर पर, उत्तर बहुत अधिक सहायक होते हैं यदि वे एक स्पष्टीकरण शामिल करते हैं कि कोड क्या करने का इरादा है, और क्यों वह दूसरों को पेश किए बिना समस्या को हल करता है।
टिम डाइकमैन

1

सरल उपयोग के साथ एक समस्या है:

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

यदि आपको बहुत बड़ी फ़ाइलों को डाउनलोड करने और सहेजने की आवश्यकता है, या सामान्य तौर पर यदि आपको कनेक्शन के मामले में स्वचालित रिट्रीज़ की आवश्यकता है, तो गिरा दिया जाता है।

मैं ऐसे मामलों में सुझाव देता हूं कि Apache HttpClient के साथ org.apache.commons.io.FileUtils भी शामिल है। उदाहरण के लिए:

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

पिछले उत्तरों को संक्षेप में (और किसी तरह पॉलिश और अपडेट करने के लिए)। निम्नलिखित तीन विधियां व्यावहारिक रूप से समतुल्य हैं। (मैंने स्पष्ट टाइमआउट जोड़ा क्योंकि मुझे लगता है कि वे बहुत जरूरी हैं, जब कनेक्शन खो जाता है तो कोई भी हमेशा के लिए फ्रीज नहीं करना चाहता है।)

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

मुझे महत्वपूर्ण अंतर नहीं मिला, सब मुझे सही लगता है। वे सुरक्षित और कुशल हैं। (गति में अंतर शायद ही प्रासंगिक लगता है - मैं स्थानीय सर्वर से एसएसडी डिस्क में 180Mb लिखता हूं जो कि 1.2 से 1.5 सेगमेंट के आसपास उतार-चढ़ाव करता है)। उन्हें बाहरी पुस्तकालयों की आवश्यकता नहीं है। सभी मनमाने आकार और (मेरे अनुभव के साथ) HTTP पुनर्निर्देशन के साथ काम करते हैं।

इसके अतिरिक्त, FileNotFoundExceptionयदि संसाधन नहीं मिला है तो सभी फेंक देते हैं (त्रुटि 404, आमतौर पर), और java.net.UnknownHostExceptionयदि DNS रिज़ॉल्यूशन विफल हो गया; अन्य IOException ट्रांसमिशन के दौरान त्रुटियों के अनुरूप हैं।

(समुदाय विकि के रूप में चिह्नित, जानकारी या सुधार जोड़ने के लिए स्वतंत्र महसूस करें)


1

अंडरस्कोर-जावा लाइब्रेरी में मेथड U.fetch (url) है ।

pom.xml:

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

कोड उदाहरण:

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

यह लिंक कितना उपयोगी है, जब लिंक अमान्य हो जाता है? कृपया जवाब कैसे दें
जिमहॉकिन्स

आप कोड संकलित नहीं करेंगे। प्रश्न में समाधान के लिए पूछें Java, लेकिन आपका जवाब जैसा दिखता हैJavaScript
कथा

@talex I ने pom.xml अनुभाग जोड़ा और कोड उदाहरण में सुधार किया।
वैलेंटाइन कोलेनिकोव

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

आप अपने कोड को केवल डंप करने के बजाय कैसे काम करता है, इसकी जानकारी देकर अपने उत्तर को बेहतर बना सकते हैं।
मेटेज कोरमुथ जूल


0

यदि आप एक प्रॉक्सी के पीछे हैं, तो आप नीचे दिए प्रोग्राम को java प्रोग्राम में सेट कर सकते हैं:

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

यदि आप प्रॉक्सी के पीछे नहीं हैं, तो अपने कोड में ऊपर की पंक्तियों को शामिल न करें। जब आप किसी प्रॉक्सी के पीछे हों तो फ़ाइल डाउनलोड करने के लिए पूर्ण कार्य कोड।

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

1 विधि नए चैनल का उपयोग कर

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 का उपयोग करके दूसरा तरीका

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

3 विधि का उपयोग कर

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

इस तरह हम बेसिक जावा कोड और अन्य थर्ड पार्टी लाइब्रेरी का उपयोग करके फाइल डाउनलोड कर सकते हैं। ये सिर्फ त्वरित संदर्भ के लिए हैं। कृपया विस्तृत जानकारी और अन्य विकल्प प्राप्त करने के लिए उपरोक्त खोजशब्दों के साथ गूगल करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.