三、Java常用小知识之下载

(一)根据豆瓣链接下载图片

/**
     * 根据文件链接,将文件下载到指定位置
     * @param downloadUrl 文件下载链接
     */
    private File downloadFile(String downloadUrl) {
        HttpURLConnection conn = null;
        File file = null;
        try {
            String fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1, downloadUrl.length());
            String dst = "." + File.separator + fileName;
            file = new File(dst);
            URL url = new URL(downloadUrl);
            conn = (HttpURLConnection) url.openConnection();
            //设置连接超时时间
            conn.setConnectTimeout(3*1000);

            /*-------------------------防止豆瓣拒绝发起的请求----------------------*/
            conn.setRequestProperty("Host","www.douban.com");
            conn.setRequestProperty("Accept","*/*");
            conn.setRequestProperty("Referer","http://www.douban.com/");
            conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.00; Windows 98);");
            conn.setRequestProperty("Pragma","no-cache");
            conn.setRequestProperty("Cache-Control","no-cache");
            conn.setRequestProperty("Connection","close");
            /*-------------------------防止豆瓣拒绝发起的请求----------------------*/
            conn.setRequestMethod("GET");
            conn.connect();
            //将字节流写进目的文件(apache的common-io工具)
            FileUtils.copyInputStreamToFile(conn.getInputStream(), file);

        } catch (IOException e) {
            logger.error("下载文件失败,文件链接为:" + downloadUrl, e);
        } finally {
            if (conn != null){
                conn.disconnect();
            }
        }
        return file;
    }

  重点关注“防止豆瓣拒绝发起请求”

(二)主线程等待子线程结束后再执行

        //根据future来设置等待该线程结束之后再进行后面的内容
        Future future = FinalName.singleThreadPool.submit(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection conn = null;
                try {
                    URL url = new URL(downloadUrl);
                    conn = (HttpURLConnection) url.openConnection();
                    //设置连接超时时间
                    conn.setConnectTimeout(3*1000);

                    /*-------------------------防止豆瓣拒绝发起的请求----------------------*/
                    conn.setRequestProperty("Host","www.douban.com");
                    conn.setRequestProperty("Accept","*/*");
                    conn.setRequestProperty("Referer","http://www.douban.com/");
                    conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.00; Windows 98);");
                    conn.setRequestProperty("Pragma","no-cache");
                    conn.setRequestProperty("Cache-Control","no-cache");
                    conn.setRequestProperty("Connection","close");
                        /*-------------------------防止豆瓣拒绝发起的请求----------------------*/
                    conn.setRequestMethod("GET");
                    conn.connect();
                    //将字节流写进目的文件
                    FileUtils.copyInputStreamToFile(conn.getInputStream(), file);

                } catch (IOException e) {
                    logger.error("下载文件失败,文件链接为:" + downloadUrl, e);
                } finally {
                    if (conn != null){
                        conn.disconnect();
                    }
                }
            }
        });
        try {
            //等待下载线程结束
            future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

猜你喜欢

转载自blog.csdn.net/panchang199266/article/details/80519151