一、斷點續傳原理 <?XML:NAMESPACE PREFIX = O />
?
?
所謂斷點續傳,說的通俗一點就是要從文件已經下載的地方開始繼續下載。
?
說的準確點,斷點續傳指的就是在下載或上傳時,將下載或上傳任務(一個文件)人為的劃分為幾個部分,每一個部分采用一個線程進行上傳或下載,如果碰到網絡故障或人為因素導致程序終止后,下次還可以從已經上傳或下載的部分開始繼續上傳下載未上傳下載的部分,而沒有必要重頭開始上傳下載。關鍵可以方便用戶,節省時間,提高效率。
?
?
二、軟件功能介紹
?
本軟件使用 Java Swing 界面編程,多線程,序列化與反序列化等 J2SE 基礎知識,其中斷點續傳的核心技術是 Java 對象的序列化和反序列化。
?
本軟件的主要功能如下:
?
<!--[if !supportLists]--> 1. ??? <!--[endif]--> 新建任務
?
?
新建下載任務,填寫 url, 線程數,保存路徑點“確定”后主窗口中添加一個下載任務。
?
<!--[if !supportLists]--> 2. ??? <!--[endif]--> 任務開始
?
?
在等待下載的記錄中選擇一條記錄點“任務開始”后被選擇的記錄開始下載
?
?
<!--[if !supportLists]--> 3. ??? <!--[endif]--> 任務暫停
?
?
在正在下載的記錄中選擇一天記錄執行此功能,暫停記錄的下載
?
?
<!--[if !supportLists]--> 4. ??? <!--[endif]--> 任務續傳
?
?
一條記錄暫停后如果需要重新下載可以選擇“任務續傳”功能,繼續下載本條記錄。
?
?
<!--[if !supportLists]--> 5. ??? <!--[endif]--> 任務取消
?
?
從下載任務中刪除不符合條件的紀錄。
?
?
<!--[if !supportLists]--> 6. ??? <!--[endif]--> 視圖
?
?
在視圖功能中可以顯示和隱藏工具欄、狀態欄
?
?
<!--[if !supportLists]--> 7. ??? <!--[endif]--> 幫助
?
?
幫助中顯示軟件的作者,聯系方式等相關信息。
?
?
三、軟件核心代碼:
?
斷點續傳內核的實現主要用了 8 個類:
?
FileInfo.java ??????? 描述下載文件的詳細信息,下載文件的網絡地址 URL
?
FileTask.java ??????? 任務主線程,同時還描述任務的詳細信息
?
MainFrame.java ?????? 下載界面
?
MyControl.java ?????? 工具類,放一些方法
?
MyListener.java ????? 主要是一些事件操作
?
NewTask.java ???????? 新建任務界面
?
SplitFileTask.java ?? 分任務線程
?
TestMain.java ??????? 最后還有一個測試類
?
1. FileInfo.java
,描述下載文件的詳細信息
?
Java代碼
001.
package
download;
002.
?
?
003.
??
?
004.
?
?
005.
import
java.io.File;
006.
?
?
007.
import
java.io.FileInputStream;
008.
?
?
009.
import
java.io.FileNotFoundException;
010.
?
?
011.
import
java.io.FileOutputStream;
012.
?
?
013.
import
java.io.IOException;
014.
?
?
015.
import
java.io.ObjectInputStream;
016.
?
?
017.
import
java.io.ObjectOutputStream;
018.
?
?
019.
import
java.io.Serializable;
020.
?
?
021.
import
java.net.HttpURLConnection;
022.
?
?
023.
import
java.net.MalformedURLException;
024.
?
?
025.
import
java.net.URL;
026.
?
?
027.
import
java.util.Calendar;
028.
?
?
029.
import
java.util.concurrent.ExecutorService;
030.
?
?
031.
??
?
032.
?
?
033.
import
javax.swing.JOptionPane;
034.
?
?
035.
import
javax.swing.JTable;
036.
?
?
037.
??
?
038.
?
?
039.
@SuppressWarnings
(
"serial"
)
040.
?
?
041.
public
class
FileTask
implements
Serializable, Runnable {
042.
?
?
043.
????
private
FileInfo fileInfo =
null
;
// 任務文件信息
044.
?
?
045.
????
private
SplitFileTask[] splitTask =
null
;
// 分任務數組
046.
?
?
047.
????
private
long
fileLength;
// 獲得文件的長度
048.
?
?
049.
????
private
long
[] startPos;
// 分任務開始位置
050.
?
?
051.
????
private
long
[] endPos;
// 分任務結束位置
052.
?
?
053.
????
private
int
countThread;
// 分任務的數目
054.
?
?
055.
????
private
boolean
isFirst =
true
;
// 是否第一次取文件
056.
?
?
057.
????
private
boolean
isStop =
true
;
// 停止標志
058.
?
?
059.
????
private
File tempFile;
// 文件下載的臨時信息
060.
?
?
061.
????
private
ExecutorService executor =
null
;
// 線程池
062.
?
?
063.
????
private
JTable viewTable =
null
;
064.
?
?
065.
????
private
int
row =
0
;
// 任務編號
066.
?
?
067.
????
private
String speed =
null
;
// 任務下載的速度
068.
?
?
069.
??
?
070.
?
?
071.
????
public
FileTask(FileInfo fileInfo, ExecutorService executor) {
072.
?
?
073.
???????
this
.fileInfo = fileInfo;
// 文件信息
074.
?
?
075.
???????
this
.executor = executor;
// 線程池
076.
?
?
077.
????
}
078.
?
?
079.
??
?
080.
?
?
081.
????
public
void
run() {
082.
?
?
083.
???????
if
(fileInfo.isOver())
// 入文件已下載完畢,則結束任務返回
084.
?
?
085.
???????????
return
;
086.
?
?
087.
???????
else
088.
?
?
089.
???????????
isStop =
false
;
// 否則,將isStop 置為false
090.
?
?
091.
??
?
092.
?
?
093.
???????
tempFile =
new
File(fileInfo.getFilePath() + File.separator
094.
?
?
095.
??????????????
+ fileInfo.getFileName() +
".info"
);
096.
?
?
097.
???????
countThread = fileInfo.getConutThread();
// 分任務的數目
098.
?
?
099.
??
?
100.
?
?
101.
???????
if
(tempFile.exists()) {
// 文件已存在,是續傳文件
102.
?
?
103.
???????????
isFirst =
false
;
104.
?
?
105.
???????????
System.out.println(
"文件已存在,是續傳文件"
+ tempFile);
106.
?
?
107.
???????????
readFilePos();
// 讀取保存的下載信息(文件指針位置)
108.
?
?
109.
???????
}
else
{
110.
?
?
111.
???????????
startPos =
new
long
[countThread];
112.
?
?
113.
???????????
endPos =
new
long
[countThread];
114.
?
?
115.
???????????
splitTask =
new
SplitFileTask[countThread];
116.
?
?
117.
???????????
fileLength = getFileLong();
// 獲取文件的長度
118.
?
?
119.
???????????
if
(fileLength <=
0
) {
120.
?
?
121.
??????????????
JOptionPane jp =
new
JOptionPane(
"網絡資源不正確!"
);
122.
?
?
123.
??????????????
jp.createDialog(
"提示信息"
);
124.
?
?
125.
??????????????
return
;
126.
?
?
127.
???????????
}
128.
?
?
129.
???????????
fileInfo.setStartDate(Calendar.getInstance());
// 設置任務開始時間
130.
?
?
131.
???????????
fileInfo.setFileLength(fileLength);
// 設置文件的長度
132.
?
?
133.
???????
}
134.
?
?
135.
???????
long
tem = fileLength / countThread;
// 每個分任務的長度
136.
?
?
137.
???????
if
(isFirst) {
// 若是第一次
138.
?
?
139.
???????????
for
(
int
i =
0
; i < countThread; i++) {
140.
?
?
141.
??????????????
startPos[i] = i * tem;
// 分任務開始位置
142.
?
?
143.
???????????
}
144.
?
?
145.
???????????
for
(
int
i =
0
; i < countThread -
1
; i++) {
146.
?
?
147.
??????????????
endPos[i] = startPos[i +
1
];
// 分任務結束位置
148.
?
?
149.
???????????
}
150.
?
?
151.
???????????
endPos[countThread -
1
] = fileLength;
152.
?
?
153.
???????????
for
(
int
i =
0
; i < countThread; i++) {
// 創建分任務
154.
?
?
155.
??????????????
/*
156.
?
?
157.
???????????????
* String path = fileInfo.getFilePath() + "http://" +
158.
?
?
159.
???????????????
* fileInfo.getFileName() + ".temp";
160.
?
?
161.
???????????????
*/
162.
?
?
163.
??????????????
String path = fileInfo.getFilePath() +
"http://"
164.
?
?
165.
?????????????????????
+ fileInfo.getFileName();
166.
?
?
167.
??????????????
splitTask[i] =
new
SplitFileTask(fileInfo.getSiteURL(), path,
168.
?
?
169.
?????????????????????
i, startPos[i], endPos[i]);
170.
?
?
171.
???????????
}
172.
?
?
173.
???????
}
174.
?
?
175.
??
?
176.
?
?
177.
???????
// 執行分任務
178.
?
?
179.
???????
for
(
int
i =
0
; i < countThread; i++) {
180.
?
?
181.
???????????
// if(!splitTask[i].isOver())
182.
?
?
183.
???????????
executor.execute(splitTask[i]);
184.
?
?
185.
???????
}
186.
?
?
187.
???????
long
tempLength = testFileLength();
// 測量文件已下載的長度
188.
?
?
189.
??
?
190.
?
?
191.
???????
boolean
flag =
true
;
192.
?
?
193.
???????
// 等待子線程結束while循環
194.
?
?
195.
???????
while
(!isStop) {
196.
?
?
197.
???????????
speed = MyControl.speed(tempLength, testFileLength(),
0
.5f);
// 測量文件下載的速度
198.
?
?
199.
???????????
tempLength = testFileLength();
200.
?
?
201.
???????????
showViewTable();
// ////刷新任務欄
202.
?
?
203.
???????????
writeFilePos();
204.
?
?
205.
???????????
if
(flag) {
206.
?
?
207.
??????????????
fileInfo.setSpendTime(fileInfo.getSpendTime() +
1
);
208.
?
?
209.
???????????
}
210.
?
?
211.
???????????
flag = !flag;
212.
?
?
213.
???????????
MyControl.sleep(
500
);
// 睡眠500毫秒
214.
?
?
215.
???????????
int
i =
0
;
216.
?
?
217.
???????????
for
(; i < countThread; i++) {
218.
?
?
219.
??????????????
if
(!splitTask[i].isStop()) {
// 分任務沒有結束
220.
?
?
221.
??????????????????
break
;
發表評論
- 瀏覽: 6687 次
-
性別:
- 來自: 重慶
-
最近訪客 更多訪客>>
最新評論
-
g411526
: 怎么能得到文件的解密解壓碼
(原創+源碼+論文) 基于Java Web技術開發的BBS論壇系統 -
buyajun
: 又是 一 水貼
Java斷點續傳實現資源文件下載軟件 -
hexl21
: 從別人那copy的吧
Java斷點續傳實現資源文件下載軟件 -
TheNewBeginning
: 字體是小了點,但是用按住ctrl+滾輪 滾動可以調整字體的啊。 ...
Java斷點續傳實現資源文件下載軟件 -
yangdefeng95802
: 暈了,那有這樣的,服了
Java斷點續傳實現資源文件下載軟件
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

評論