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