使用java下载http形式的图片
来源:互联网 发布:人变老的软件 编辑:程序博客网 时间:2024/06/08 07:30
文章来源:http://blog.csdn.net/keepfriend/article/details/53556426
用于下载http形式的图片
以下是自定义的DownUtil类:
- import java.io.*;
- import java.net.*;
-
- public class DownUtil {
-
- private String path;
- private String targetFile;
- private int threadNum;
- private DownThread[] threads;
- private int fileSize;
- private class DownThread extends Thread{
- private int startPos;
- private int currentPartSize;
- private RandomAccessFile currentPart;
- public int length;
- public DownThread(int startPos, int currentPartSize, RandomAccessFile currentPart){
- this.startPos = startPos;
- this.currentPartSize = currentPartSize;
- this.currentPart = currentPart;
- }
- public void run(){
- try{
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5 * 1000);
- conn.setRequestMethod("GET");
- conn.setRequestProperty(
- "Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, "
- + "application/x-shockwave-flash, application/xaml+xml, "
- + "application/vnd.ms-xpsdocument, application/x-ms-xbap, "
- + "application/x-ms-application, application/vnd.ms-excel, "
- + "application/vnd.ms-powerpoint, application/msword, */*");
- conn.setRequestProperty("Accept-Language", "zh-CN");
- conn.setRequestProperty("Charset", "UTF-8");
- InputStream inStream = conn.getInputStream();
- inStream.skip(this.startPos);
- byte[] buffer = new byte[1024];
- int hasRead = 0;
-
- while(length < currentPartSize && (hasRead = inStream.read(buffer)) != -1){
- currentPart.write(buffer, 0, hasRead);
- length += hasRead;
- }
- currentPart.close();
- inStream.close();
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
-
- public DownUtil(String path, String targetFile, int threadNum) {
- this.path = path;
- this.threadNum = threadNum;
- this.threads = new DownThread[threadNum];
- this.targetFile = targetFile;
- }
-
- public void download() throws Exception{
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5 * 1000);
- conn.setRequestMethod("GET");
- conn.setRequestProperty(
- "Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, "
- + "application/x-shockwave-flash, application/xaml+xml, "
- + "application/vnd.ms-xpsdocument, application/x-ms-xbap, "
- + "application/x-ms-application, application/vnd.ms-excel, "
- + "application/vnd.ms-powerpoint, application/msword, */*");
- conn.setRequestProperty("Accept-Language", "zh-CN");
- conn.setRequestProperty("Charset", "UTF-8");
- conn.setRequestProperty("Connection", "Keep-Alive");
-
- fileSize = conn.getContentLength();
- conn.disconnect();
- int currentPartSize = fileSize / threadNum + 1;
- RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
- file.setLength(fileSize);
- file.close();
-
- for(int i = 0; i < threadNum; ++i){
- int startPos = i * currentPartSize;
- RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw");
- currentPart.seek(startPos);
- threads[i] = new DownThread(startPos, currentPartSize, currentPart);
- threads[i].start();
- }
- }
-
- public double getCompleteRate(){
- int sumSize = 0;
- for(int i = 0; i < threadNum; ++i){
- sumSize += threads[i].length;
- }
- return sumSize * 1.0 / fileSize;
- }
- }
这是主程序:- public class MultiThreadedDownload {
-
- public static void main(String[] args) throws Exception{
- DownUtil downUtil = new DownUtil("http://imgsrc.baidu.com/baike/pic" +
- "/item/8644ebf81a4c510f64b65cfa6559252dd52aa5e4.jpg", "liuyan.jpg", 4);
- downUtil.download();
- new Thread(()->{
- while(downUtil.getCompleteRate() < 1){
- System.out.println("已完成:" + downUtil.getCompleteRate());
- try{
- Thread.sleep(1000);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }).start();
- }
- }
谢谢浏览!