(一)根据豆瓣链接下载图片
/**
* 根据文件链接,将文件下载到指定位置
* @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();
}