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 + -
显示快捷键?