各位非常抱歉,成了标题党,我只是一个初学者,这只是一个URL的练手demo
一、架构(伪)
我知道我现在写的这个框架很烂所以就写个(伪)
二、代码实现
DownloadOperation类
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
/**
* @Description:一个文件的下载
* @Author:Zc9741
* @QQ:516906531
*/
public class DownloadOperation {
private URL url;
private String filePath;
private int threadCount;
//private DownloadThread[] task;
private long size;
public static long downloaded;
public DownloadOperation(String urlString,String filePath, int threadCount) {
try {
this.url=new URL(urlString);
} catch (Exception e) {
e.printStackTrace();
}
this.filePath = filePath;
this.threadCount = threadCount;
//task=new DownloadThread[threadCount];
}
public void download(){
//获取文件的大小
getFileSize();
//System.out.println(size);
//创建文件 用于保存下载的数据
creatfile();
//分配线程下载数据
dispatch();
}
private void dispatch() {
//计算每个线程下载的平均大小
long average=size/threadCount;
//每个线程下载的位置
long start=0;
long downloadSize =average;
for (int i = 0; i < threadCount; i++) {
start=i*average;
//最后一个线程下载的更多
if(i==threadCount-1){
downloadSize=size-start;
}
//创建线程 执行对应的模块进行下载
DownloadThread dt=new DownloadThread(url,filePath,start,downloadSize);
//保存线程对象
//task[i]=dt;
// 启动下载
dt.start();
}
}
//获取进度条
public float currentRate(){
long len=0;
len=downloaded;
return (float)len/size;
}
private void creatfile() {
File file=new File(filePath);
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//设置文件大小
RandomAccessFile rac=null;
try {
rac=new RandomAccessFile(file,"rw");
rac.setLength(size);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
rac.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void getFileSize(){
//url
//获取链接
HttpURLConnection conn=null;
try {
conn= (HttpURLConnection) url.openConnection();
conn.setRequestMethod("HEAD");
//获取资源大小
size = conn.getContentLengthLong();
} catch (IOException e) {
e.printStackTrace();
}finally {
conn.disconnect();
}
}
}
DownloadThread类
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @Description:
* @Author:Zc9741
* @QQ:516906531
*/
public class DownloadThread extends Thread {
private URL url;
private String filePatgh;
private long startPosition;
private long downloadsize;
private long downloadedLength;
public DownloadThread(URL url, String filePatgh, long startPosition, long downloadsize) {
this.url = url;
this.filePatgh = filePatgh;
this.startPosition = startPosition;
this.downloadsize = downloadsize;
}
@Override
public void run() {
//定位到这个线程应该写入的位置
try {
RandomAccessFile raf=new RandomAccessFile(filePatgh,"rw");
raf.seek(startPosition);
//开始下载
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setConnectTimeout(5000);
//获取输入流
InputStream is = url.openStream();
//设置数据读取位置
is.skip(startPosition);//调到该线程负责的文件位置
//开始读取数据 写入到文件
byte[] buffer = new byte[1024];
int len=0;
while ((len=is.read(buffer))!=-1){
raf.write(buffer,0,len);
//记录当前下载的长度
downloadedLength =len+downloadedLength;
DownloadOperation.downloaded += len;
//判断当前线程下载的范围是否结束
if(downloadedLength>=downloadsize){
break;
}
}
is.close();
conn.disconnect();
raf.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
DownloadManager类
import java.util.Map;
/**
* @Description:
* @Author:Zc9741
* @QQ:516906531
*/
public class DownloadManager {
private Map<String,String>[] source;
private static DownloadManager manager;
private DownloadManager(){}
//单例设计模式
public static DownloadManager getManager(){
if(manager==null){
synchronized (DownloadManager.class){
if(manager==null){
manager=new DownloadManager();
}
}
}
return manager;
}
//下载一个文件 (重载)
public void loadDate(String urlString,String filePath){
DownloadOperation downloader=new DownloadOperation(urlString,filePath,3);
downloader.download();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
float rate = downloader.currentRate();
if(rate>=0.99){
System.out.println("当前下载进度:100.00%");
System.out.println("下载完成");
break;
}else{
String format = String.format("%.2f", rate*100);
System.out.println("当前下载进度:"+format+"%");
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
//下载多个文件
public void loadDate(Map<String,String>[] datas){
}
}
MyClass类
public class MyClass {
public static void main(String[] args) {
String url="http://localhost/upLoad/video/(demo)通讯录代码实现.mp4";
String filePath="D:\\Users\\Desktop\\TestFile\\interview.mp4";
DownloadManager manager = DownloadManager.getManager();
manager.loadDate(url,filePath);
}
}
三、测试结果