日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

ftp 断点续传 Android,Android使用FTP实现断点续传

發(fā)布時(shí)間:2023/12/4 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ftp 断点续传 Android,Android使用FTP实现断点续传 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android使用FTP實(shí)現(xiàn)斷點(diǎn)續(xù)傳

斷點(diǎn)續(xù)傳指的是在下載或上傳時(shí),將下載或上傳任務(wù)(一個(gè)文件或一個(gè)壓縮包)人為的劃分為幾個(gè)部分,每一個(gè)部分采用一個(gè)線程進(jìn)行上傳或下載,如果碰到網(wǎng)絡(luò)故障,可以從已經(jīng)上傳或下載的部分開始繼續(xù)上傳下載未完成的部分,而沒有必要從頭開始上傳下載。用戶可以節(jié)省時(shí)間,提高速度。

我們都知道Android下使用HTTP實(shí)現(xiàn)斷點(diǎn)續(xù)傳很容易。因?yàn)槲覀冊(cè)诎l(fā)送下載請(qǐng)求給服務(wù)器后,服務(wù)器會(huì)將該文件的信息返回給我們。同時(shí)我們也可以設(shè)置發(fā)送文件的起始位置,讓服務(wù)器從該位置開始傳輸文件。

簡單介紹一下FTP(File Transfer Protocol)文件傳輸協(xié)議。用于Internet上的控制文件的雙向傳輸。在FTP的使用當(dāng)中,用戶經(jīng)常遇到兩個(gè)概念:”下載”(Download)和”上傳”(Upload)。用Internet語言來說,用戶可通過客戶機(jī)程序向(從)遠(yuǎn)程主機(jī)上傳(下載)文件。

FTP沒有所謂的頭文件,剛接觸到還是有點(diǎn)霧水的,不知從何下手。但是查詢一下資料后,覺得還是挺簡單的,只需要一個(gè)指令。多說無益,給大家舉個(gè)栗子- -、

private Runnable mRunnable = new Runnable() {

@Override

public void run() {

try {

try {

ftpClient.connect(ftpHost, ftpPort);// 連接FTP服務(wù)器

ftpClient.setControlEncoding("iso-8859-1");

} catch (Exception e) {

mHandler.sendEmptyMessage(DOWNLOAD_FAILED);

return;

}

if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode()))

return;

if (ftpClient.login(ftpUser, ftpPwd)) {

// 設(shè)置被動(dòng)模式

ftpClient.enterLocalPassiveMode();

// 設(shè)置以二進(jìn)制方式傳輸

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

// 檢查遠(yuǎn)程文件是否存在

FTPFile[] files = ftpClient.listFiles(new String(

ftpFileName.getBytes("GBK"), "iso-8859-1"));

int per = (int) (files[0].getSize() / 100);

FileOutputStream output = null;

InputStream input = null;

long localSize = 0L;

if (files.length == 0) {// 文件不存在,下載失敗

mHandler.sendEmptyMessage(DOWNLOAD_FAILED);

return;

} else {// 開始下載

File file = new File(strLocalFile);

if (file.exists()) {// 存在,開始續(xù)傳

localSize = file.length();

if (localSize > files[0].getSize()) {// 下載完成

mHandler.sendEmptyMessage(DOWNLOAD_SUCCESS);

return;

}

// 從本地文件上續(xù)傳

output = new FileOutputStream(file, true);

// 將文件指向已下載的位置

ftpClient.setRestartOffset(localSize);

input = ftpClient.retrieveFileStream(new String(

ftpFileName.getBytes("GBK"), "iso-8859-1"));

progress = (int) (localSize / per);

mHandler.sendEmptyMessage(DOWNLOAD_UPDATE);

} else {// 直接下載

output = new FileOutputStream(file);

input = ftpClient.retrieveFileStream(new String(

ftpFileName.getBytes("GBK"), "iso-8859-1"));

mHandler.sendEmptyMessage(DOWNLOAD_START);

}

if (output == null || input == null) {

mHandler.sendEmptyMessage(DOWNLOAD_FAILED);

return;

}

byte[] bytes = new byte[1024];

int c;

while ((c = input.read(bytes)) != -1) {

if (isBreak) {

Log.i("xxx", "已停止下載!");

mHandler.sendEmptyMessage(DOWNLOAD_STOP);

break;

}

output.write(bytes, 0, c);

localSize += c;

long nowProcess = localSize / per;

if (nowProcess > progress) {

progress = nowProcess;

if (progress % 1 == 0) {

Log.i("xxx", "下載進(jìn)度:" + progress);

}

mHandler.sendEmptyMessage(DOWNLOAD_UPDATE);

}

}

input.close();

output.close();

if (c <= 0) {// 下載完成

mHandler.sendEmptyMessage(DOWNLOAD_SUCCESS);

} else {

mHandler.sendEmptyMessage(DOWNLOAD_STOP);

}

}

}

} catch (Exception e) {

try {

ftpClient.disconnect();

} catch (IOException e1) {

e1.printStackTrace();

}

e.printStackTrace();

}

}

};

下面說一下使用FTP具體流程以及注意事項(xiàng)。

1. FTP的連接以及下載操作必須放在子線程中

2. ftpClient.setControlEncoding(“iso-8859-1”)設(shè)置字符編碼,防止出現(xiàn)中文亂碼現(xiàn)象

3. 獲取本地已下載文件大小,然后使用ftpClient.setRestartOffset(localSize),可以開始斷點(diǎn)續(xù)傳了

FTP實(shí)現(xiàn)斷點(diǎn)續(xù)傳就這么簡單完成了,逃。

ps:我使用jar包是Apache的commons-net。實(shí)現(xiàn)FTP斷點(diǎn)續(xù)傳,服務(wù)端的FTP也得支持?jǐn)帱c(diǎn)續(xù)傳的指令。 pps:功力有限,若有什么錯(cuò)誤,請(qǐng)不吝賜教,謝謝

總結(jié)

以上是生活随笔為你收集整理的ftp 断点续传 Android,Android使用FTP实现断点续传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。