⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sitefilefetch.java

📁 http 多线程断点下载 http 多线程断点下载
💻 JAVA
字号:
package httpdrowload.file;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;


public class SiteFileFetch extends Thread {
	
	long[]              nStartPos;         //开始位置
	long[]              nEndPos;           //结束位置
	FileSplitterFetch[] fileSplitterFetch; //子线程对象
	long                nFileLength;       //文件长
	File                tmpFile;           //文件下载的临时信息
	DataOutputStream    output;            //输出到文件的输出流
	SiteInfoBean siteInfoBean = null;      //文件信息Bean
	boolean      bFirst       = true;      //是否第一次取文件
	boolean      bStop        = false;     //停止标志
	
	public SiteFileFetch(SiteInfoBean bean) throws IOException{
		siteInfoBean = bean;
		tmpFile = new File(siteInfoBean.getSFilePath() +
						   File.separator + 
						   siteInfoBean.getSFileName() + 
						   ".info");
		if(tmpFile.exists ())
		{
			bFirst = false;
			read_nPos();
		}
		else{
			nStartPos = new long[bean.getNSplitter()];
			nEndPos   = new long[bean.getNSplitter()];
		}
	}
	
	public void run()
	{
		//获得文件长度
		//分割文件
		//实例FileSplitterFetch
		//启动FileSplitterFetch线程
		//等待子线程返回
		try{
			if(bFirst)
			{
				nFileLength = getFileSize();
				if(nFileLength == -1)
				{
					System.err.println("File Length is not known!");
				}
				else if(nFileLength == -2)
				{
					System.err.println("File is not access!");
				}
				else
				{
					for(int i=0;i < siteInfoBean.getNSplitter();i++ ){
						nStartPos[i] = (long)(i*(nFileLength/nStartPos.length));
					}
					for(int i=0;i < siteInfoBean.getNSplitter() - 1;i++ ){
						nEndPos[i] = nStartPos[i+1];
					}
					nEndPos[nEndPos.length-1] = nFileLength;
				}
			}
		
			//启动子线程
			fileSplitterFetch = new FileSplitterFetch[nStartPos.length];
			for(int i=0;i<nStartPos.length;i++) {
				fileSplitterFetch[i] = new FileSplitterFetch(siteInfoBean.getSSiteURL(),
															 siteInfoBean.getSFilePath() + 
															 	File.separator + 
															 	siteInfoBean.getSFileName(), 
															 nStartPos[i],
															 nEndPos[i],
															 i);
				Utility.log("Thread " + i + " , nStartPos = " + 
							nStartPos[i] + 
							", nEndPos = " + 
							nEndPos[i]);
				fileSplitterFetch[i].start();
			}
			
			//等待子线程结束
			//int count = 0;
			//是否结束while循环
			boolean breakWhile = false;
		
			while(!bStop)
			{
				write_nPos();
				Utility.sleep(100);
				breakWhile = true;
			
				for(int i=0;i<nStartPos.length;i++) {
					if(!fileSplitterFetch[i].bDownOver)
					{
						breakWhile = false;
						break;
					}
				}
				if(breakWhile)
					break;
			}
			System.err.println("文件下载结束!");
		}
			catch(Exception e){e.printStackTrace ();
		}
	}

	//获得文件长度
	public long getFileSize()
	{
		long nFileLength = -1;
		HttpURLConnection httpConnection = null;
		
		try{
			URL url = new URL(siteInfoBean.getSSiteURL());
			httpConnection = (HttpURLConnection)url.openConnection();
			httpConnection.connect();
				
			int responseCode = httpConnection.getResponseCode();
			if(responseCode>=400)
			{
				processErrorCode(responseCode);
				return -2;
			}
			
			nFileLength = Long.parseLong(httpConnection.getHeaderField("Content-Length"));

		}
		catch(IOException e){
			e.printStackTrace ();
			httpConnection.disconnect();
			System.exit(0);
		}catch(Exception e){
			e.printStackTrace ();
			httpConnection.disconnect();
			System.exit(0);
		}
		
		Utility.log(nFileLength);
		httpConnection.disconnect();
		return nFileLength;
	}

	//保存下载信息(文件指针位置)
	private void write_nPos()
	{
		try{
			output = new DataOutputStream(new FileOutputStream(tmpFile));
			output.writeInt(nStartPos.length);
			for(int i=0;i < siteInfoBean.getNSplitter();i++ ){
				output.writeLong(fileSplitterFetch[i].nStartPos);
				output.writeLong(fileSplitterFetch[i].nEndPos);
			}
			output.close();
		}
		catch(IOException e){
			e.printStackTrace ();
		}
		catch(Exception e){
			e.printStackTrace ();
		}
	}

	//读取保存的下载信息(文件指针位置)
	private void read_nPos()
	{
		try{
			DataInputStream input = new DataInputStream(new FileInputStream(tmpFile));
			int nCount = input.readInt();
			nStartPos = new long[nCount];
			nEndPos = new long[nCount];
			for(int i = 0; i < nCount; i++) {
				nStartPos[i] = input.readLong();
				nEndPos[i]   = input.readLong();
			}
			input.close();
		}
		catch(IOException e){
			e.printStackTrace ();
		}
		catch(Exception e){
			e.printStackTrace ();
		}
	}

	private void processErrorCode(int nErrorCode)
	{
		System.err.println("Error Code : " + nErrorCode);
	}

	//停止文件下载
	public void siteStop()
	{
		bStop = true;
		for(int i=0;i < nStartPos.length ;i++ )
			fileSplitterFetch[i].splitterStop();

	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -