download.java
来自「一款JAVA开发的类迅雷的多线程下载系统,希望对大家有帮助」· Java 代码 · 共 622 行 · 第 1/2 页
JAVA
622 行
if(contentLength < 1){
error();
date1 = new Date();
pane.list.append(formatter.format(date1)+": 此文件不存在,退出下载......"+"\n");
System.out.println("此文件不存在!!!");
break;
}
if(size == -1||size == contentLength){
size = contentLength;
date1 = new Date();
pane.list.append(formatter.format(date1)+": 连接服务器成功,文件大小:"+size+"字节"+"\n");
stateChanged();
}
if(startPos[0] == -1&&startPos[1] == -1&&startPos[2] == -1){
for(int i=0;i<startPos.length;i++){
startPos[i] = (long)(i*(size/startPos.length));
}
for(int i=0;i<endPos.length-1;i++){
endPos[i] = startPos[i+1];
}
endPos[endPos.length-1] = size;
File file = new File(filePos);
if(SetUpDialog.tishi){
System.out.println(SetUpDialog.tishi);
while(file.isFile()){
filename = JOptionPane.showInputDialog("此文件名在当前目录下已经存在,请输入一个文件名");
while(filename.equals("")){
filename = JOptionPane.showInputDialog("输入不能为空!!");
}
filePos = filemenu +"\\" +filename;
file = new File(filePos);
}}else{
StringTokenizer st = new StringTokenizer(filename,".");
String[] s_buffer = new String[2];
int i=0;
while(st.hasMoreTokens())
{
s_buffer[i] = st.nextToken();
i++;
}
for(int j=1;file.isFile();j++){
filename = s_buffer[0]+"("+j+")"+"."+s_buffer[1];
System.out.println(filename);
filePos = filemenu +"\\" +filename;
file = new File(filePos);
}
}
}else{
if(!duandian) //此处判断是否是断点 是的话将不会执行下面的语句
for(int i=0;i<nthread;i++){
startPos[i] = downloadSplitter[i].startPos;
downloadSplitterdownloaded[i]= downloadSplitter[i].downloaded;
}
//设置此对象不已经开始下载 相对来说不是断点了
duandian = false;
}
for(int i=0;i<startPos.length;i++){
pane.list.append(formatter.format(date1)+": 线程"+(i+1)+"下载范围:"+startPos[i]+"--"+endPos[i]+"\n");
}
downloadSplitter = new DownloadSplitter[startPos.length];
SplitterPane = new Panel[startPos.length];
for(int i=0;i<startPos.length;i++){
SplitterPane[i] = new Panel();
downloadSplitter[i] = new DownloadSplitter(url1,filePos,startPos[i],
endPos[i],i,downloadSplitterdownloaded[i],5,SplitterPane[i]);
System.out.println("线程"+i+"启动");
}
date1 = new Date();
pane.list.append(formatter.format(date1)+"各线程已启动"+"\n");
icon = getIcon();
boolean breakWhile = false;
long downloaded1 = 0; //用来计算下载速度
long downloaded2; //用来计算下载速度
while(status == DOWNLOADING){
stateChanged();
downloaded2 = 0;
Thread.sleep(1000);
breakWhile = true;
for(int i=0;i<startPos.length;i++){
downloaded2 += downloadSplitter[i].downloaded;
}
for(int i=0;i<startPos.length;i++){
if(!downloadSplitter[i].done){
breakWhile = false;
break;
}
}
speed =(int)(downloaded2 - downloaded1);
downloaded1 = downloaded2;
downloaded = downloaded2;
if(speed !=0){
time = formattime.changTime((int)(size-downloaded)/speed);
}
if(breakWhile)
break;
}
if(status == DOWNLOADING){
status = COMPLETE;
sound.start();
System.out.println("文件下载完成");
date1 = new Date();
dated = formatter.format(date1);
pane.list.append(formatter.format(date1)+": 文件下载完成"+"\n");
usetime.getStatus(status);
pane.list.setText("");
pane.list.append("文件名:"+filename+"\n");
pane.list.append("文件大小:"+size+"字节\n");
pane.list.append("- - - - - - - - - - - - - - - - - - - - "+"\n");
pane.list.append("存放位置:"+filemenu+"\n");
pane.list.append("URL:"+url.toString()+"\n");
pane.list.append("任务创建时间:"+date+"\n");
pane.list.append("任务完成日期:"+dated+"\n");
pane.list.append("下载用时:"+timed+"\n");
stateChanged();
MainFrame.main.tabbedpane.removeAll();
break;
}
}catch(Exception e){
date1 = new Date();
pane.list.append(formatter.format(date1)+": 第"+(cishu+1)+"次连接服务器失败!!5秒后重试!!!!"+"\n");
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
if(!SetUpDialog.xianzhicishu)
cishu++;
}
if(lianjieleixing == FTP){
try
{
downloaded = 0; //没有实现断点续传
date1 = new Date();
pane.list.append(formatter.format(date1)+": 开始连接......"+"\n");
FtpClient fc = new FtpClient(hosturl);
if(fc.serverIsOpen()){
fc.closeServer();
}
fc=new FtpClient(hosturl);
fc.login(user,password);
date1 = new Date();
pane.list.append(formatter.format(date1)+": 发送用户名:"+user+"\n");
date1 = new Date();
pane.list.append(formatter.format(date1)+": 发送密码:"+password+"\n");
//判断文件名是否重复
File fi = new File(filePos);
if(size == -1){
if(SetUpDialog.tishi){
System.out.println(SetUpDialog.tishi);
while(fi.isFile()){
filename = JOptionPane.showInputDialog("此文件名在当前目录下已经存在,请输入一个文件名");
while(filename.equals("")){
filename = JOptionPane.showInputDialog("输入不能为空!!");
}
filePos = filemenu +"\\" +filename;
fi = new File(filePos);
}}else{
String[] s_buffer = new String[2];
s_buffer[0] = filename.substring(0,filename.lastIndexOf('.'));
s_buffer[1] = filename.substring(filename.lastIndexOf('.')+1);
for(int j=1;fi.isFile();j++){
filename = s_buffer[0]+"("+j+")"+"."+s_buffer[1];
System.out.println(filename);
filePos = filemenu +"\\" +filename;
fi = new File(filePos);
}
}
icon = getIcon();
}
//
RandomAccessFile getFile = new RandomAccessFile(fi,"rw");
getFile.seek(0);
fc.binary();
TelnetInputStream fget=fc.get(file);
if(size == -1){
String resposed = fc.getResponseString();
resposed = resposed.substring(resposed.indexOf("(")+1,resposed.lastIndexOf(' '));
size = Long.parseLong(resposed);
}
DataInputStream instream = new DataInputStream(fget);
date1 = new Date();
pane.list.append(formatter.format(date1)+": 开始下载文件....."+"\n");
while(status == DOWNLOADING){
byte buffer[];
int buffersize =(int)(size - downloaded);
if(buffersize > 1024){
buffer = new byte[1024];
}else {
buffer = new byte[buffersize];
}
int read = instream.read(buffer);
getFile.write(buffer,0,read);
downloaded += read;
stateChanged();
if(downloaded == size)
break;
}
fget.close();
getFile.close();
fc.closeServer();
System.out.println("ftp已经关闭");
if(status == DOWNLOADING){
status = COMPLETE;
sound.start();
System.out.println("文件下载完成");
date1 = new Date();
dated = formatter.format(date1);
pane.list.append(formatter.format(date1)+": 文件下载完成"+"\n");
usetime.getStatus(status);
pane.list.setText("");
pane.list.append("文件名:"+filename+"\n");
pane.list.append("文件大小:"+size+"字节\n");
pane.list.append("- - - - - - - - - - - - - - - - - - - - "+"\n");
pane.list.append("存放位置:"+filemenu+"\n");
pane.list.append("URL:"+hosturl+"\n");
pane.list.append("任务创建时间:"+date+"\n");
pane.list.append("任务完成日期:"+dated+"\n");
pane.list.append("下载用时:"+timed+"\n");
stateChanged();
MainFrame.main.tabbedpane.removeAll();
break;
}
}catch (IOException ex){
ex.printStackTrace();
date1 = new Date();
pane.list.append(formatter.format(date1)+": 第"+(cishu+1)+"次连接服务器失败!!5秒后重试!!!!"+"\n");
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
}
if(!SetUpDialog.xianzhicishu)
cishu++;
}
}
}
if(cishu == SetUpDialog.cishu){
error();
System.out.println("超过重试次数,自动退出!!!");
date1 = new Date();
pane.list.append(formatter.format(date1)+": 超过重试次数,自动退出!!!"+"\n");
}
}
public void stateChanged(){
setChanged();
notifyObservers();
}
}
class UseTime implements Runnable{
int time = 0;
FormatTime formattime = new FormatTime();
String usetime;
boolean status;
public UseTime(int status){
if(status == Download.DOWNLOADING)
this.status = true;
else this.status =false;
}
public void run(){
while(status){
usetime = formattime.changTime(time);
time++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public String getUseTime(){
return usetime;
}
public void getStatus(int status){
if(status == Download.DOWNLOADING)
this.status = true;
else this.status =false;
}
public void start(int status){
Thread thread = new Thread(this);
if(status == Download.DOWNLOADING)
this.status = true;
else this.status =false;
thread.start();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?