How to download and save a file from Internet using Java?

前端 未结 21 2892
情深已故
情深已故 2020-11-21 05:06

There is an online file (such as http://www.example.com/information.asp) I need to grab and save to a directory. I know there are several methods for grabbing a

21条回答
  •  余生分开走
    2020-11-21 05:39

    There are many elegant and efficient answers here. But the conciseness can make us lose some useful information. In particular, one often does not want to consider a connection error an Exception, and one might want to treat differently some kind of network-related errors - for example, to decide if we should retry the download.

    Here's a method that does not throw Exceptions for network errors (only for truly exceptional problems, as malformed url or problems writing to the 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;
    }
    

提交回复
热议问题