📄 downfile.java
字号:
package multidownload;
import javax.swing.JTextArea;
import java.net.*;
import java.io.*;
public class DownFile extends Thread //分析要下载的文件并启动下载进程
{
String dlURL;
String saveFileAs;
int nthread;
String info=new String();
JTextArea textArea=new JTextArea();
long[] position;
long[] startPos;
long[] endPos;
DownFileSplitter[] downFileSplitter; //子线程对象
long fileLength;
boolean stop=false;
//DataOutputStream output;
public DownFile(String sURL,String saveFileAs,int nthread,JTextArea textArea) throws IOException
{
this.dlURL=sURL;
this.saveFileAs=saveFileAs;
this.nthread=nthread;
this.textArea=textArea;
startPos=new long[nthread];
endPos=new long[nthread];
}
public void run()
{
info="目标文件: "+dlURL;
System.out.println(info);
textArea.append("\n"+info);
info="\n 线程总数: "+nthread;
System.out.println(info);
textArea.append("\n"+info);
try
{
fileLength=getFileSize();
if (fileLength==-1)
{
System.err.println("不可知的文件长度");
textArea.append("\n 不可知的文件长度!请重试!!");
}
else
{
if(fileLength==-2)
{
System.err.println("文件无法获取!");
textArea.append("\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++)
{
info="线程:"+i+"下载范围:"+startPos[i]+"--"+endPos[i];
System.out.println(info);
textArea.append("\n"+info);
}
downFileSplitter=new DownFileSplitter[startPos.length];//启动一组子线程
for(int i=0;i<startPos.length;i++)
{
downFileSplitter[i]=new DownFileSplitter(dlURL,saveFileAs,
startPos[i],endPos[i], i,textArea);
info="线程 "+i+"启动";
textArea.append("\n"+info);
downFileSplitter[i].start();
System.out.println(info);
}
boolean breakWhile=true;
while(breakWhile)
{
Thread.sleep(500);
breakWhile=false;
for(int i=0;i<downFileSplitter.length;i++)
{
if(!downFileSplitter[i].done)
{
breakWhile=true;
break;
}
}
}
System.out.println("文件传输结束!");//文件传输结束
textArea.append("\n 文件传输结束!");
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
public long getFileSize()
{
int fileLength=-1;
try
{
URL url=new URL(dlURL);
HttpURLConnection httpConnection=(HttpURLConnection) (url.openConnection());
int responseCode=httpConnection.getResponseCode();
if(responseCode>=400)
{
System.out.println("Web服务器响应错误");
return -2;//Web服务器响应错误
}
String sHeader;
for(int i=1;;i++)//查找标识文件长度的文件头,获取文件长度
{
sHeader=httpConnection.getHeaderFieldKey(i);
if(sHeader!=null)
{
if(sHeader.equals("Content-Length"))
{
fileLength=Integer.parseInt(httpConnection.getHeaderField(sHeader));
break;
}
}
else
{
break;
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
return fileLength;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -