?? sitefilefetch.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 + -