//嘗試移動(dòng)文件內(nèi)讀取指針,實(shí)現(xiàn)斷點(diǎn)續(xù)傳
創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為綏芬河等服務(wù)建站,綏芬河等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為綏芬河企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
result
=
uploadFile(remoteFileName,
f,
ftpClient,
remoteSize);
//如果斷點(diǎn)續(xù)傳沒(méi)有成功,則刪除服務(wù)器上文件,重新上傳
if(result
==
UploadStatus.Upload_From_Break_Failed){
if(!ftpClient.deleteFile(remoteFileName)){
return
UploadStatus.Delete_Remote_Faild;
}
result
=
uploadFile(remoteFileName,
f,
ftpClient,
0);
}
024字節(jié))。第一次B接收了512字節(jié),那么第二次連接A就應(yīng)該從513字節(jié)開始傳輸。
也就是說(shuō),在第二次傳輸時(shí),B要提供“我要從513字節(jié)開始傳送文件F”的信息,然后A使用FileInputStream構(gòu)建輸入流讀取本地文件,使用skip(512)方法跳過(guò)文件F的前512字節(jié)再傳送文件,之后B將數(shù)據(jù)追加(append)到先前接收的文件末尾即可。
進(jìn)一步考慮,如果要實(shí)現(xiàn)多線程傳送,即分塊傳輸,也同樣的道理。假如B要求分作兩塊同時(shí)傳輸,那么A啟動(dòng)兩個(gè)線程,一個(gè)從513字節(jié)讀到768字節(jié)(工256字節(jié)),第二個(gè)線程從769字節(jié)到1024字節(jié)即可。
如果你要從網(wǎng)絡(luò)上下載文件,就是說(shuō)A方不是你實(shí)現(xiàn)的,那么你要先確認(rèn)A方支不支持?jǐn)嚯娎m(xù)傳功能(HTTP1.1),然后你查閱下HTTP1.1協(xié)議,在HTTP1.1版本里,可以通過(guò)設(shè)置請(qǐng)求包頭某個(gè)字段的信息(使用URLConnection創(chuàng)建連接并使用setRequestProperty(String key, String value) 方法設(shè)置)從而精確讀取文件的某一段數(shù)據(jù)的。注意,基于HTTP斷點(diǎn)續(xù)傳的關(guān)鍵是1.1版本,1.0版本是不支持的。
補(bǔ)充:
嗯,查到了,是設(shè)置range屬性,即setRequestProperty("range", "bytes=513-1024").你可以使用迅雷下載某個(gè)文件,然后從”線程信息“中就可以看到這個(gè)http1.1斷點(diǎn)續(xù)傳的所有行為信息了。
斷點(diǎn)設(shè)置方法,當(dāng)有臨時(shí)文件時(shí),直接在臨時(shí)文件中讀取上次中斷時(shí)的斷點(diǎn)位置。沒(méi)有臨時(shí)文件,即第一次時(shí),重新設(shè)置斷點(diǎn)。
rantmpfile.seek()跳轉(zhuǎn)到一個(gè)位置的目的是為了讓各個(gè)斷點(diǎn)存儲(chǔ)的位置盡量分開。
1package com.tangshun.;
2
3import java.io.File;
4import java.io.IOException;
5import java.io.InputStream;
6import java.io.RandomAccessFile;
7import java.net.HttpURLConnection;
8import java.net.MalformedURLException;
9import java.net.URL;
10
11//斷點(diǎn)續(xù)傳
12public class DownLoad {
13
14 public static void down(String URL, long nPos, String savePathAndFile) {
15 try {
16 URL url = new URL(URL);
17 HttpURLConnection httpConnection = (HttpURLConnection) url
18 .openConnection();
19 // 設(shè)置User-Agent
20 httpConnection.setRequestProperty("User-Agent", "NetFox");
21 // 設(shè)置斷點(diǎn)續(xù)傳的開始位置
22 httpConnection.setRequestProperty("RANGE", "bytes=" + nPos);
23 // 獲得輸入流
24 InputStream input = httpConnection.getInputStream();
25 RandomAccessFile oSavedFile = new RandomAccessFile(savePathAndFile,
26 "rw");
27 // 定位文件指針到nPos位置
28 oSavedFile.seek(nPos);
29 byte[] b = new byte[1024];
30 int nRead;
31 // 從輸入流中讀入字節(jié)流,然后寫到文件中
32 while ((nRead = input.read(b, 0, 1024)) 0) {
33 (oSavedFile).write(b, 0, nRead);
34 }
35 httpConnection.disconnect();
36 } catch (MalformedURLException e) {
37 e.printStackTrace();
38 } catch (IOException e) {
39 e.printStackTrace();
40 }
41 }
42
43 public static long getRemoteFileSize(String url) {
44 long size = 0;
45 try {
46 HttpURLConnection conn = (HttpURLConnection) (new URL(url))
47 .openConnection();
48 size = conn.getContentLength();
49 conn.disconnect();
50 } catch (Exception e) {
51 e.printStackTrace();
52 }
53 return size;
54 }
55
56public static void main(String[] args) {
57 String url = " ";
58 String savePath = "F:\\";
59 String fileName = url.substring(url.lastIndexOf("/"));
60 String fileNam=fileName;
61 HttpURLConnection conn = null;
62 try {
63 conn = (HttpURLConnection) (new URL(url)).openConnection();
64 } catch (Exception e) {
65 e.printStackTrace();
66 }
67 File file = new File(savePath + fileName);
68 // 獲得遠(yuǎn)程文件大小
69 long remoteFileSize = getRemoteFileSize(url);
70 System.out.println("遠(yuǎn)程文件大小="+remoteFileSize);
71 int i = 0;
72 if (file.exists()) {
73 // 先看看是否是完整的,完整,換名字,跳出循環(huán),不完整,繼續(xù)下載
74 long localFileSize = file.length();
75 System.out.println("已有文件大小為:"+localFileSize);
76
77 if (localFileSize remoteFileSize) {
78 System.out.println("文件續(xù)傳");
79 down(url, localFileSize, savePath + fileName);
80 }else{
81 System.out.println("文件存在,重新下載");
82 do{
83 i++;
84 fileName = fileNam.substring(0, fileNam.indexOf(".")) + "(" + i
85 + ")" + fileNam.substring(fileNam.indexOf("."));
86
87 file = new File(savePath + fileName);
88 }while(file.exists());
89 try {
90 file.createNewFile();
91 } catch (IOException e) {
92 e.printStackTrace();
93 }
94 down(url, 0, savePath + fileName);
95 }
96 // 下面表示文件存在,改名字
97
98 } else {
99 try {
100 file.createNewFile();
101 System.out.println("下載中");
102 down(url, 0, savePath + fileName);
103 } catch (IOException e) {
104 e.printStackTrace();
105 }
106 }
107 }}
108
當(dāng)前標(biāo)題:斷點(diǎn)續(xù)傳java代碼,實(shí)現(xiàn)斷點(diǎn)續(xù)傳
標(biāo)題路徑:http://muchs.cn/article34/phgose.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、全網(wǎng)營(yíng)銷推廣、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站收錄、網(wǎng)站建設(shè)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)