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