📄 download.java
字号:
package com.sam.net.download;
import javax.swing.JTextArea;
import java.net.*;
import java.io.*;
public class Download extends Thread //分析要下载的文件并启动下载进程
{
URL url;
String saveAs;
int nthread;
String info=new String();
JTextArea textArea=new JTextArea();
boolean breakWhile=true;
long[] position;
long[] startPos;
long[] endPos;
DownloadThread[] dt; //子线程对象
long fileLength;
String filename;
Search search;
public Download(URL url,String saveAs,int nthread,JTextArea textArea,Search search) throws IOException
{
this.url=url;
this.saveAs=saveAs;
this.nthread=nthread;
this.textArea=textArea;
this.search = search;
startPos=new long[nthread];
endPos=new long[nthread];
dt=new DownloadThread[startPos.length];
}
public void run()
{
info="目标文件: "+url;
textArea.append("\n"+info+"\n文件下载中.............");
info="线程总数: "+nthread;
textArea.append("\n"+info);
try
{
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
filename=url.getFile().substring(url.getFile().lastIndexOf("/")+1);
fileLength=getFileSize();
if (fileLength==-1)
{
textArea.append("\n不可知的文件长度!请重试!!\n");
}
else
{
if(fileLength==-2)
{
textArea.append("\n文件无法获取!请重试!!\n");
}
else
{
//将要下载的文件进行分段
for(int i=0;i<startPos.length;i++){
startPos[i]=(long) (i*(fileLength/startPos.length));
}
for(int i=0;i<endPos.length-1;i++)
endPos[i]=startPos[i+1];
endPos[endPos.length-1]=fileLength;
//启动一组子线程
for(int i=0;i<startPos.length;i++)
{
dt[i]=new DownloadThread(url,saveAs, startPos[i],endPos[i],search);
dt[i].start();
}
while(breakWhile)
{
Thread.sleep(500);
breakWhile=false;
for(int i=0;i<dt.length;i++)
{
if(!dt[i].done)
{
breakWhile=true;
break;
}
}
}
search.status = search.COMPLETE;
search.stateChanged();
textArea.append("\n"+filename+"文件下载完毕!!\n");
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
// public void stopDownload()
// {
// for(int i=0;i<startPos.length;i++)
// {
// dt[i].setstop(false);
// }
// }
public long getFileSize()
{
int fileLength=-1;
try
{
HttpURLConnection huc=(HttpURLConnection)url.openConnection();
int responseCode=huc.getResponseCode();
if(responseCode>=400)
{
return -2;//Web服务器响应错误
}
String sHeader;
for(int i=1;;i++)//查找标识文件长度的文件头,获取文件长度
{
sHeader=huc.getHeaderFieldKey(i);
if(sHeader!=null)
{
if(sHeader.equals("Content-Length"))
{
fileLength=Integer.parseInt(huc.getHeaderField(sHeader));
break;
}
}
else
{
break;
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
return fileLength;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -