前段時間因為任務需要本人這個java渣渣開始研究如何用java實現簡單的文件斷點續傳。所謂的文件斷點續傳,我的理解是文件在傳輸過程中因為某些原因程序停止運行文件終止傳輸,下一次重新傳輸文件的時候還能從上一次傳輸的位置開始傳輸,而不需要重新從頭開始。
文件傳輸的過程分為發送方和接收方,最終我的思路是這樣的:
1:傳輸開始之前發送方先向接收方發送一個確認信息,然后再向接收方發送准備發送的文件的文件名
2:接收方收到確認信息之后,接收從發送方發送過來的文件名,接收完之后向發送方發送一個確認信息表示文件名接收完畢,然后接收方根據收到的文件名創建一個“.temp”File對象和一個“.temp”RandomAccessFile對象。獲取這個File對象所對應文件的長度(大小)(這個長度就是接收方已經接受的長度,如果之前沒有接收過這個文件,長度就為0),並把文件長度發送給發送方。
3:發送方收到確認信息之后,接收接受方發送的文件長度,然后向接收方發送准備發送的文件的總長度,並向接收方發送一個確認信息。然后根據接收方發送的文件長度,從文件對應長度的位置開始發送。
4:接收方收到確認信息之后,接受發送方發送過來的數據,然后從此文件的末尾寫入。接受完成之后再將“.temp”文件重命名為正常的文件名。
把過程畫成圖就是下面這樣:

ok”表示確認信息
能夠實現斷點續傳的關鍵就是使用了RandomAccessFile,此類的實例支持對隨機訪問文件的讀取和寫入。
加入一些如進度條、文件選擇器之類的GUI,最終的主要代碼如下:
發送方代碼:
接收方代碼:
接收方測試:
發送方測試:
注意 先運行接收方代碼再運行發送方代碼,測試的時候我們選一個大一點的文件,我這里選了個電影文件,運行結果如下:
首先會有是否接收的提示框
點擊是后,開始接收,點擊否就取消

至此就成功結束了!
