(一)斷點續傳的原理
其實斷點續傳的原理很簡單
打個比方
假設服務器域名為
GET /down
Accept: image/gif
excel
Accept
Accept
User
Connection: Keep
服務器收到請求後
Content
Accept
Date=Mon
ETag=W/
Content
Server=Microsoft
Last
所謂斷點續傳
Web服務器的時候要多加一條信息
下面是用自己編的一個
GET /down
User
RANGE: bytes=
Accept: text/html
仔細看一下就會發現多了一行RANGE: bytes=
這一行的意思就是告訴服務器down
服務器收到這個請求以後
Content
Content
Date=Mon
ETag=W/
Content
Server=Microsoft
Last
和前面服務器返回的信息比較一下
Content
返回的代碼也改為
知道了以上原理
(二)Java實現斷點續傳的關鍵幾點
(
當然用最原始的Socket是肯定能完成的
URL url = new URL(
HttpURLConnection httpConnection = (HttpURLConnection)url
();
//設置User
(
//設置斷點續傳的開始位置
(
//獲得輸入流
InputStream input = ();
從輸入流中取出的字節流就是down
大家看
接下來要做的事就是怎麼保存獲得的流到文件中去了
保存文件采用的方法
我采用的是IO包中的RandAccessFile類
操作相當簡單
RandomAccess oSavedFile = new RandomAccessFile(
long nPos =
//定位文件指針到nPos位置
oSavedFile
byte[] b = new byte[
int nRead;
//從輸入流中讀入字節流
while((nRead=input
{
oSavedFile
}
怎麼樣
接下來要做的就是整合成一個完整的程序了
(三)斷點續傳內核的實現
主要用了
SiteFileFetch
FileSplitterFetch
FileAccess
SiteInfoBean
Utility
TestMethod
下面是源程序
/*
**SiteFileFetch
*/
package NetFox;
import java
import
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
tmpFile = new File(bean
if(tmpFile
{
bFirst = false;
read_nPos();
}
else
{
nStartPos = new long[bean
nEndPos = new long[bean
}
}
public void run()
{
//獲得文件長度
//分割文件
//實例FileSplitterFetch
//啟動FileSplitterFetch線程
//等待子線程返回
try{
if(bFirst)
{
nFileLength = getFileSize();
if(nFileLength ==
{
System
}
else if(nFileLength ==
{
System
}
else
{
for(int i=
{
nStartPos[i] = (long)(i*(nFileLength/nStartPos
}
for(int i=
{
nEndPos[i] = nStartPos[i+
}
nEndPos[nEndPos
}
}
//啟動子線程
fileSplitterFetch = new FileSplitterFetch[nStartPos
for(int i=
{
fileSplitterFetch[i] = new FileSplitterFetch(siteInfoBean
siteInfoBean
nStartPos[i]
Utility
fileSplitterFetch[i]
}
// fileSplitterFetch[nPos
siteInfoBean
// Utility
nEndPos =
// fileSplitterFetch[nPos
//等待子線程結束
//int count =
//是否結束while循環
boolean breakWhile = false;
while(!bStop)
{
write_nPos();
Utility
breakWhile = true;
for(int i=
{
if(!fileSplitterFetch[i]
{
breakWhile = false;
break;
}
}
if(breakWhile)
break;
//count++;
//if(count>
// siteStop();
}
System
}
catch(Exception e){e
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26964.html