download.java
来自「一款JAVA开发的类迅雷的多线程下载系统,希望对大家有帮助」· Java 代码 · 共 622 行 · 第 1/2 页
JAVA
622 行
package downfile;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Observable;
import java.util.StringTokenizer;
import javax.swing.Icon;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import sun.net.TelnetInputStream;
import sun.net.ftp.FtpClient;
public class Download extends Observable implements Runnable{
//下载状态
public static final int DOWNLOADING = 0;
public static final int PAUSED = 1;
public static final int COMPLETE = 2;
public static final int ERROR = 3;
public static final int CANCEL = 4;
//协议类型
public static final int HTTP = 1;
public static final int FTP = 2;
int lianjieleixing =0 ;
//下载连接
String url;
private long size; //文件大小
private int speed; //下载速度
private long downloaded = 0; //已经下载的文件的大小
private long[] downloadSplitterdownloaded;
int status; //文件下载状态
private String filename; //文件名称
private String timed = ""; //下载已经用时
private String time = ""; //还剩下的时间
private String filemenu; //文件所在目录
private String filePos; //文件所在位置
JFileChooser chooser = new JFileChooser();
Icon icon = null; //文件图标
Sound sound = new Sound(); //声音类对象
int nthread; //文件下载的线程数
int cishu = 0;
long[] startPos; //每个线程开始下载的位置
long[] endPos; //每个线程结束下载的位置
DownloadSplitter[] downloadSplitter; //每个下载线程对象
Panel[] SplitterPane; //线程面板
//FTP协议属性
String user = null;
String password = null;
String hosturl = null;
String file = null;
boolean duandian = false;
Panel pane;
UseTime usetime;
FormatTime formattime = new FormatTime();
String date; //记录开始任务创建时间
String dated; //记录任务完成时间
Date date1; //显示在TABBEDPANE上PANEL中的日期
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式花日期显示
//此构造函数供HTTP协议新建下载任务时用
public Download(String url,int nthread,String filename,String filemenu){
size = -1;
status = DOWNLOADING;
this.url = url;
this.nthread = nthread;
this.filename = filename;
this.filemenu = filemenu;
filePos = filemenu +"\\"+filename;
if(url.toLowerCase().startsWith("http://")){
lianjieleixing = HTTP;
startPos = new long[nthread];
endPos = new long[nthread];
downloadSplitterdownloaded = new long[nthread];
for(int i=0;i<nthread;i++){
startPos[i] = -1;
}
}else{
lianjieleixing = FTP;
TiquFtpUrl tiquftpurl = new TiquFtpUrl(url);
tiquftpurl.Tiqu();
user = tiquftpurl.user;
password = tiquftpurl.password;
hosturl = tiquftpurl.hosturl;
file = tiquftpurl.file;
}
usetime = new UseTime(DOWNLOADING);
Date date1 = new Date(); //记录程序开始的时间
date = formatter.format(date1);
pane = new Panel();
MainFrame.main.tabbedpane.removeAll();
MainFrame.main.tabbedpane.addTab("任务信息",pane);
download();
}
// 此构造函数 当程序退出后,将已经下载的任务保存 下载在读出的时候 就
// 调用此构造函数 来NEW一个DOWNLOAD对象
public Download(String url, String filename, String filemenu, long size,
int status, String date, String dated, String timed) {
this.url = url;
if(url.toLowerCase().startsWith("http://")){
lianjieleixing = HTTP;
}else{
lianjieleixing = FTP;
}
this.filename = filename;
this.filemenu = filemenu;
this.size = size;
this.status = status;
this.date = date;
this.dated = dated;
this.timed = timed;
filePos = filemenu + "\\" + filename;
icon = getIcon();
pane = new Panel();
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");
}
//此构造函数功能同上,只是提供给没有完成的任务
public Download(int status,String urlstr,String filename,String filemenu,int nthread,long[] startPos,
long[] endPos,long[] downloadSplitterdownloaded,long size,String date,String timed,int lianjieleixing){
this.status = PAUSED;
duandian = true;
this.lianjieleixing = lianjieleixing;
url = urlstr;
if(lianjieleixing == FTP){
TiquFtpUrl tiquftpurl = new TiquFtpUrl(url);
tiquftpurl.Tiqu();
user = tiquftpurl.user;
password = tiquftpurl.password;
hosturl = tiquftpurl.hosturl;
file = tiquftpurl.file;
}
this.nthread = nthread;
this.filename = filename;
this.filemenu = filemenu;
this.startPos = startPos;
this.endPos = endPos;
this.downloadSplitterdownloaded = downloadSplitterdownloaded;
this.size = size;
this.date = date;
for(int i=0;i<nthread;i++){
this.downloaded += downloadSplitterdownloaded[i];
}
this.timed = timed;
usetime = new UseTime(DOWNLOADING);
pane = new Panel();
// MainFrame.main.tabbedpane.addTab("任务信息",pane);
filePos = filemenu +"\\"+filename;
icon = getIcon();
if(icon == null)
JOptionPane.showMessageDialog(null,"上次下载的文件已经不存在,要重新下载!!");
if(SetUpDialog.autorun){
this.status = DOWNLOADING;
download();
}
}
public String getUrl(){
return url;
}
public long getSize(){
return size;
}
public float getProgress(){
return ((float)downloaded / size)*100;
}
public int getSpeed(){
return speed;
}
public String getDate(){
return date;
}
public String getDated(){
return dated;
}
public String getTimed(){
if(usetime !=null)
timed = usetime.getUseTime();
return timed;
}
public String getTime(){
return time;
}
public int getStatus(){
return status;
}
public void pause(){ //暂停
status = PAUSED;
usetime.getStatus(status);
if(lianjieleixing == HTTP)
for(int i=0;i<nthread;i++){
downloadSplitter[i].setStop(true);
}
date1 = new Date();
pane.list.append(formatter.format(date1)+": 用户暂停下载......"+"\n");
stateChanged();
}
public void resume(){ //重新开始
status = DOWNLOADING;
date1 = new Date();
pane.list.append(formatter.format(date1)+": 重新下载......"+"\n");
stateChanged();
download();
}
public void cancel(){ //取消下载
status = CANCEL;
usetime.getStatus(status);
if(!duandian&&lianjieleixing == HTTP){
for(int i=0;i<nthread;i++){
downloadSplitter[i].setStop(true);
}
date1 = new Date();
pane.list.append(formatter.format(date1)+": 用户取消下载......"+"\n");
}
stateChanged();
}
public void error(){ //下载错误处理
status = ERROR;
usetime.getStatus(status);
stateChanged();
}
public String getFileName(){
return filename;
}
public String getMenuname(){
return filemenu;
}
private void download(){
Thread thread = new Thread(this);
thread.start();
usetime.start(DOWNLOADING);
}
public long getDownloaded(){
return downloaded;
}
public Icon getIcon(){
File file = null;
file = new File(filePos);
if(file.isFile())
icon = chooser.getIcon(file);
return icon;
}
public void run() {
if(!duandian){
MainFrame.main.tabbedpane.removeAll();
MainFrame.main.tabbedpane.addTab("任务信息",pane);
}
while(cishu < SetUpDialog.cishu &&status ==DOWNLOADING){
if(lianjieleixing ==HTTP)
try{
int contentLength = -1;
date1 = new Date();
pane.list.append(formatter.format(date1)+": 开始连接......"+"\n");
URL url1 = new URL(url);
HttpURLConnection connection =
(HttpURLConnection) url1.openConnection();
connection.connect();
if(connection.getResponseCode() / 100 !=2){
error();
}
contentLength = connection.getContentLength();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?