package xyy.download;
import vvv.download.api.ConnectionException;
import xyy.download.api.Connection;
import xyy.download.api.ConnectionManager;
import xyy.download.api.DownloadListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* Created by 14258 on 2017/3/14.
*/
public class FileDownloader {
private static final int threadNumber = 3;//下载线程数
private String url;//传入的url地址
public String fileName = "D://download";
private DownloadListener listener;//下载监听器;
private ConnectionManager connectionManager;//下载管理器;
//设置url
public FileDownloader(String url) {
this.url = url;
}
//设置下载链接管理
public void setConnectionManager(ConnectionManager connectionManager) {
this.connectionManager = connectionManager;
}
//设置下载监听器
public void setListener(DownloadListener listener) {
this.listener = listener;
}
//执行下载
public void execute() {
Connection conn = null;
try {
try {
conn = connectionManager.open(this.url);//又连接管理器打开根据url打开来连接
} catch (ConnectionException e) {
e.printStackTrace();
}
int length = conn.getContentLength();//获取conn长度
this.fileName = fileName + "//" + conn.getFileName();//获取文件名字
conn.close();
startDownload(length, threadNumber);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.close();
}
}
}
private void startDownload(int length, int i) {
if (length <= 0) {
listener.notifyFinished();
return;
}
//设置一个和将要下载的文件一个同样大小的临时文件
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(this.fileName, "rw");
randomAccessFile.setLength(length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
randomAccessFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
int block = length / threadNumber;
block = block == 0 ? block : block + 1;
System.out.println("length"+length+"block"+block);
for (i=0;i<threadNumber;i++){
int start = i*block;
int end = (i+1)*block-1;
try {
new DownloadThread(connectionManager.open(url),start,end,"下载线程"+1,this).start();
} catch (ConnectionException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public int downNum;
public synchronized void addDownNumber() {
downNum++;
System.out.println("下载完成..."+downNum);
if (downNum>=threadNumber){
if (listener!=null){
listener.notifyFinished();
}
}
}
}