Java--多线程断点下载 (一)

2014-11-24 09:49:22 · 作者: · 浏览: 0
import java.net.HttpURLConnection;
import java.net.URL;


public class Main {
	
	private static Messages messages = new Messages();
	
	private static CallBack callback = new CallBack() {
		@Override
		public void schedule(Messages messages) {
			long totalDownloadSize = messages.getTotalDownloadSize();
			int currentDownloadSize = messages.getCurrentDownloadSize();
			System.out.println((float)currentDownloadSize * 100.0f / (float)totalDownloadSize + "%");
		}
		
		@Override
		public void handlerMessages(Messages messages) {
			
		}
		
		@Override
		public void fail(Messages messages) {
			System.out.println(messages.getMsg());
		}
	};
	
	public static void main(String[] args) throws Exception {
		long startTime = System.currentTimeMillis();
		String downloadUrl = "http://www.xiazaiba.com/route.php ct=stat&ac=stat_ads&id=CG8BOVNg&g=aHR0cDovL3d3dy51aWJpYS5jb20vamttc2V0dXAuZXhl";
		URL url = new URL(downloadUrl);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setReadTimeout(1000 * 5);
		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("Referer", downloadUrl); 
		conn.setRequestProperty("Charset", "UTF-8");
		conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
		conn.setRequestProperty("Connection", "Keep-Alive");
		conn.connect();
		
		if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
			FileDownloader loader = new FileDownloader(callback, 4, messages);
			int size = conn.getContentLength();//根据响应获取文件大小
			loader.setSavePath("E:\\haoya.exe");
			loader.setConfigPath("E:\\haoya.properties");
			loader.download(downloadUrl, size);
		}else{
			System.out.println(conn.getResponseCode());
		}
		
		conn.disconnect();
		long endTime = System.currentTimeMillis();
		System.out.println("Time" + (endTime - startTime));
	}
}
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.URL;
import java.util.Map;

public class FileDownloader implements DownLoadCallBack {
	//单个线程已经下载的长度
	private int downloadSize;
	//线程数 
	private DownloadThread[] threads;
	// 每条线程下载的长度 
	private int block;
	//文件保存路径
	private String savePath;
	//配置文件路径
	private String configPath;
	private File saveFile;
	private boolean isNext;
	private int call_curr;
	private int call_total;
	private PropertiesHelper propertiesHelper;    
	private Map datas;
	private Messages messages;
	private CallBack callback;
	//总的下载长度
	private int downloadLength;
	//是否退出下载
	private boolean exit;

	public FileDownloader(CallBack callback, int threadNum, Messages messages) {
		this.callback = callback;