1. 程式人生 > >用 Java 實現斷點續傳 (HTTP)

用 Java 實現斷點續傳 (HTTP)

/* 
 /*
 * SiteFileFetch.java 
 */ 
 package NetFox; 
 import java.io.*; 
 import java.net.*; 
 public class SiteFileFetch extends Thread { 
 SiteInfoBean siteInfoBean = null; // 檔案資訊 Bean 
 long[] nStartPos; // 開始位置
 long[] nEndPos; // 結束位置
 FileSplitterFetch[] fileSplitterFetch; // 子執行緒物件
 long nFileLength; // 檔案長度
 boolean bFirst = true; // 是否第一次取檔案
 boolean bStop = false; // 停止標誌
 File tmpFile; // 檔案下載的臨時資訊
 DataOutputStream output; // 輸出到檔案的輸出流
 public SiteFileFetch(SiteInfoBean bean) throws IOException 
 { 
 siteInfoBean = bean; 
 //tmpFile = File.createTempFile ("zhong","1111",new File(bean.getSFilePath())); 
 tmpFile = new File(bean.getSFilePath()+File.separator + bean.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<nStartPos.length;i++) 
 { 
 nStartPos[i] = (long)(i*(nFileLength/nStartPos.length)); 
 } 
 for(int i=0;i<nEndPos.length-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(); 
 } 
 // fileSplitterFetch[nPos.length-1] = new FileSplitterFetch(siteInfoBean.getSSiteURL(),
 siteInfoBean.getSFilePath() + File.separator 
 + siteInfoBean.getSFileName(),nPos[nPos.length-1],nFileLength,nPos.length-1); 
 // Utility.log("Thread " +(nPos.length-1) + ",nStartPos = "+nPos[nPos.length-1]+",
 nEndPos = " + nFileLength); 
 // fileSplitterFetch[nPos.length-1].start(); 
 // 等待子執行緒結束
 //int count = 0; 
 // 是否結束 while 迴圈
 boolean breakWhile = false; 
 while(!bStop) 
 { 
 write_nPos(); 
 Utility.sleep(500); 
 breakWhile = true; 
 for(int i=0;i<nStartPos.length;i++) 
 { 
 if(!fileSplitterFetch[i].bDownOver) 
 { 
 breakWhile = false; 
 break; 
 } 
 } 
 if(breakWhile) 
 break; 
 //count++; 
 //if(count>4) 
 // siteStop(); 
 } 
 System.err.println("檔案下載結束!"); 
 } 
 catch(Exception e){e.printStackTrace ();} 
 } 
 // 獲得檔案長度
 public long 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 ()); 
 //Utility.log(in.readLine()); 
 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 ();} 
 Utility.log(nFileLength); 
 return nFileLength; 
 } 
 // 儲存下載資訊(檔案指標位置)
 private void write_nPos() 
 { 
 try{ 
 output = new DataOutputStream(new FileOutputStream(tmpFile)); 
 output.writeInt(nStartPos.length); 
 for(int i=0;i<nStartPos.length;i++) 
 { 
 // output.writeLong(nPos[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<nStartPos.length;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(); 
 } 
 }

相關推薦

Java實現斷點 (HTTP)

斷點續傳的原理 其實斷點續傳的原理很簡單,就是在 Http 的請求上和一般的下載有所不同而已。 打個比方,瀏覽器請求伺服器上的一個文時,所發出的請求如下: 假設伺服器域名為 www.sjtu.edu.cn,檔名為 down.zip。 GET /down.zip HTTP/1

Java 實現斷點 (HTTP)

/* /* * SiteFileFetch.java */ package NetFox; import java.io.*; import java.net.*; public class SiteFileFetch extends Thread { Sit

Java 實現斷點 (HTTP)

公司需要用Java做斷點續傳的實現,沒有接觸過,不過根據自己的理解就是檔案接著上次傳輸的繼續完成傳輸,具體的操作看到IBM這位仁兄的例子。 1、斷點續傳的原理 其實斷點續傳的原理很簡單,就是在 Http 的請求上和一般的下載有所不同而已。  打個比方,瀏覽器請求伺服

AsyncTask實現斷點

asynctask實現文件下載與斷點續傳 在學習四大組件之一的service時,正好可以利用asyncTask 和OKhttp來進行斷點續傳,並在手機的前臺顯示下載進度。 嘗試下載的是Oracle官網上的jdk1.7 在AS中使用OKhttp,只需要簡單的在app/build.grad

FTP下reget實現斷點 (FTP下get顯示進度)

同事在Linux通過FTP獲取一個1.3G的大檔案,傳了一個上午,結果在1.1G左右的時候,資料鏈路斷開,ftp命令假死狀態,檔案大小不在增加。如果重新匯入,下午肯定完不成了,得考慮斷點續傳,以前都是通過windows下的工具完成的,目前的問題是:在Unix下如何處理呢?方法

java多執行緒實現斷點下載

public class DownloadThread extends Thread {private int id;private int startindex;private int endindex;private String path;static int threadfinishedcount=0

java斷點簡單實現

斷點續傳主要是使用http協議中range的屬性來取得資源的部分內容,由於一般服務是不對外直接提供url訪問的,一般都是通過id,在servlet中輸出byte[]來實現,所以要想實現斷點續傳一般要自己實現服務端和客戶端,客戶端保持檔案的下載或上傳狀態,(儲存在本地或者資料

java檔案斷點的簡單實現

import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.aw

http range實現斷點斷點載)

使用http range實現斷點續傳(伺服器端): public void downRangeFile( File downloadFile, HttpServletResponse response,

rsync 實現斷點

direct pan 悲劇 文件 byte font scp命令 size receive Linux 主機之間即時傳送文件,scp命令大家都很熟悉但當要傳送的文件較大,過程中如果網絡中斷了,就比較悲劇了。這時候可以考慮使用rsync命令替代scp,實現斷點續傳文件。 試驗

java實現ftp上檔案

實際專案需求:從資料庫查詢資訊,在本地生成檔案,再上傳到ftp 所用Jar包:NetComponents.jar 核心程式碼: import java.io.File; import java.io.FileInputStream; import java.io.IOExcepti

5.2 SpringBoot實現斷點功能 > 我的程式猿之路:第四十二章

  功能使用webuploader元件分片下載檔案 文件地址: http://fex.baidu.com/webuploader/document.html 從  http://fex.baidu.com/webuploader/download.html中下載 用到的是:

iOS實現斷點

網路下載是我們在專案中經常要用到的功能,如果是小檔案的下載,比如圖片和文字之類的,我們可以直接請求源地址,然後一次下載完畢。但是如果是下載較大的音訊和視訊檔案,不可能一次下載完畢,使用者可能下載一段時間,關閉程式,回家接著下載。這個時候,就需要實現斷點續傳的功能。讓使用者可以隨時暫停下載,下次開始下

Python實現斷點下載檔案,大檔案下載還怕下載到一半就斷了嗎?不存在!

這篇部落格簡單介紹python斷點續傳下載檔案,並加入花哨的下載進度顯示方法,涉及Python檔案操作的技巧,和一些函式庫的使用。 環境 Python 3.6 requests模組 對應檔案的下載連結 (要下載的檔案必須支援斷點續傳) (是不是很少東西

簡單實現斷點+MVP+Retrofit+RxJava

依賴: compile 'com.squareup.retrofit2:retrofit:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.s

libcurl實現斷點

實現斷點續傳主要就是通過curl_easy_setopt設定好CURLOPT_RESUME_FROM_LARGE屬性完成 首先獲取已下載檔案大小,然後設定CURLOPT_RESUME_FROM_LARGE屬性,從指定位元組開始下載 #include <sys/sta

C#檔案下載(實現斷點

1 public class WebDown 2 { 4 /// 下載檔案方法 6 /// 檔案儲存路徑和檔名 7 /// 返回伺服器檔名 9 public static bool DeownloadFil

自定義Source實現斷點

        在Flume進行實時資料的採集過程中,可能會出現宕機的情況,再重新工作時不能斷點續傳,導致資料丟失或資料讀取重複而浪費資源。自定義Source可以解決這個問題。1)寫一個類繼承AbstractSource抽象類並實現Configurable介面和EventDr

iOS-AFNetworking實現斷點功能

上一節說到利用系統原生的方法實現斷點續傳功能,這次我們說下當下最時尚的第三方網路請求庫AFNetworking,利用AFNet實現斷點續傳。其實原理是和NSURLSessionDataTask一樣的。因為我們都知道AFNet在3.0之後是封裝的NSURLSess

python實現斷點下載檔案

最近的任務裡有一個功能是要我從日誌伺服器實時跟新日誌到本地,日誌在不斷新增內容就需要我隔一段時間從上次下載的位置繼續下載,並寫入本地檔案上次寫完的位置後面。 headers = {'Range': 'bytes=%d-' % local_f