sitefilefetch.java

来自「实现java断点续传多线程处理原代码,三种形式下载,」· Java 代码 · 共 273 行

JAVA
273
字号
package com.download;

import java.io.*;
import java.net.*;

/**
 * 负责整个文件的抓取,控制内部线程。
 * @author yeqc	
 * 2008-06-28
 */
public class SiteFileFetch extends Thread {

	/**
	 * 文件信息Bean
	 */
	SiteInfoBean siteInfoBean = null; 
	
	/**
	 * 开始位置
	 */
	long[] nStartPos; 
	
	/**
	 * 结束位置
	 */
	long[] nEndPos; 
	
	/**
	 * 子线程对象
	 */
	FileSplitterFetch[] fileSplitterFetch; 
	
	/**
	 * 文件长度
	 */
	int nFileLength; 
	
	/**
	 * 是否第一次取文件
	 */
	boolean bFirst = true;
	
	/**
	 * 停止标志
	 */
	boolean bStop = false; 
	
	/**
	 * 文件下载的临时信息
	 */
	File tmpFile; 
	
	/**
	 * 输出到文件的输出流
	 */
	DataOutputStream output; 


	public SiteFileFetch(SiteInfoBean bean) throws IOException
	{
		siteInfoBean = bean;
		tmpFile = new File(bean.getSFilePath()+File.separator + 
				bean.getSFileName()+".info");
		System.out.print("----tmpFile------"+tmpFile);
		if(tmpFile.exists ())
		{
			System.out.print("----exists------");
			bFirst = false;
			read_nPos();
		}
		else
		{
		System.out.print("---noexists-----");
		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<nStartPos.length;i++){
				nStartPos[i] = (long)(i*(nFileLength/nStartPos.length));
		}
		for(int i=0;i<nEndPos.length;i++){
			nEndPos[i] = nStartPos[i+1];
			}
			nEndPos[nEndPos.length-1] = nFileLength;
			}
		}
		
		
		//启动子线程
		fileSplitterFetch = new FileSplitterFetch[nStartPos.length];
		for(int i=0;i<fileSplitterFetch.length;i++){
			fileSplitterFetch[i] = new 
			FileSplitterFetch(siteInfoBean.getSSiteURL(),
			siteInfoBean.getSFilePath() + File.separator + 
			siteInfoBean.getSFileName(),
			nStartPos[i],nEndPos[i],i);
			
			fileSplitterFetch[i].start();
			}
		
		
		new FileSplitterFetch(siteInfoBean.getSSiteURL(),siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(),nStartPos[nStartPos.length-1],nEndPos[nEndPos.length-1],nFileLength);
		
		
		//是否结束while循环
		boolean breakWhile = false;
		
		
		while(!bStop)
		{
			write_nPos();
			Thread.sleep(500);
			breakWhile = true;
			for(int i=0;i<fileSplitterFetch.length;i++){
			if(!fileSplitterFetch[i].bDownOver){
				breakWhile = false;
				break;
				}
			}
			if(breakWhile)
			break;
	
			}
		System.err.println("文件下载结束!");
		}catch(Exception e){
			e.printStackTrace ();
		}
	}
	
	
	//获得文件长度
	public int getFileSize()
	{
	int nFileLength = -1;
		try{
		URL url = new URL(siteInfoBean.getSSiteURL());
		HttpURLConnection httpConnection = 
		(HttpURLConnection)url.openConnection ();
		httpConnection.setRequestProperty("User-Agent","NetFox");
		
		
		int responseCode=httpConnection.getResponseCode();
		if(responseCode>=400)
		{
		processErrorCode(responseCode);
		return -2; //-2 represent access is error
		}
		String sHeader;

		for(int i=1;;i++){
			DataInputStream in = new 
			DataInputStream(httpConnection.getInputStream ());
		
			sHeader=httpConnection.getHeaderFieldKey(i);
		if(sHeader!=null)
		{
			if(sHeader.equals("Content-Length"))
			{
				nFileLength = 
					Integer.parseInt(httpConnection.getHeaderField(sHeader));
				break;
				}
		}
		else
			break;
		}
		
		}catch(IOException e){
			e.printStackTrace ();
			
		}catch(Exception e){
		e.printStackTrace ();
		}
	
	return nFileLength;
	}
	
	
	/**
	 * 保存下载信息(文件指针位置)
	 */
	private void write_nPos()
	{
	try{
		output = new DataOutputStream(new FileOutputStream(tmpFile));
		output.writeInt(nStartPos.length);
		for(int i=0;i<fileSplitterFetch.length;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();
		System.out.println("----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<fileSplitterFetch.length;i++){
			fileSplitterFetch[i].splitterStop();
			
		}
		
	}

}

⌨️ 快捷键说明

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