ftp 断点续传 Android,Android使用FTP实现断点续传
Android使用FTP實現(xiàn)斷點續(xù)傳
斷點續(xù)傳指的是在下載或上傳時,將下載或上傳任務(wù)(一個文件或一個壓縮包)人為的劃分為幾個部分,每一個部分采用一個線程進行上傳或下載,如果碰到網(wǎng)絡(luò)故障,可以從已經(jīng)上傳或下載的部分開始繼續(xù)上傳下載未完成的部分,而沒有必要從頭開始上傳下載。用戶可以節(jié)省時間,提高速度。
我們都知道Android下使用HTTP實現(xiàn)斷點續(xù)傳很容易。因為我們在發(fā)送下載請求給服務(wù)器后,服務(wù)器會將該文件的信息返回給我們。同時我們也可以設(shè)置發(fā)送文件的起始位置,讓服務(wù)器從該位置開始傳輸文件。
簡單介紹一下FTP(File Transfer Protocol)文件傳輸協(xié)議。用于Internet上的控制文件的雙向傳輸。在FTP的使用當(dāng)中,用戶經(jīng)常遇到兩個概念:”下載”(Download)和”上傳”(Upload)。用Internet語言來說,用戶可通過客戶機程序向(從)遠程主機上傳(下載)文件。
FTP沒有所謂的頭文件,剛接觸到還是有點霧水的,不知從何下手。但是查詢一下資料后,覺得還是挺簡單的,只需要一個指令。多說無益,給大家舉個栗子- -、
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è)置被動模式
ftpClient.enterLocalPassiveMode();
// 設(shè)置以二進制方式傳輸
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 檢查遠程文件是否存在
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", "下載進度:" + 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具體流程以及注意事項。
1. FTP的連接以及下載操作必須放在子線程中
2. ftpClient.setControlEncoding(“iso-8859-1”)設(shè)置字符編碼,防止出現(xiàn)中文亂碼現(xiàn)象
3. 獲取本地已下載文件大小,然后使用ftpClient.setRestartOffset(localSize),可以開始斷點續(xù)傳了
FTP實現(xiàn)斷點續(xù)傳就這么簡單完成了,逃。
ps:我使用jar包是Apache的commons-net。實現(xiàn)FTP斷點續(xù)傳,服務(wù)端的FTP也得支持斷點續(xù)傳的指令。 pps:功力有限,若有什么錯誤,請不吝賜教,謝謝
總結(jié)
以上是生活随笔為你收集整理的ftp 断点续传 Android,Android使用FTP实现断点续传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 资源文件获取啥退,重拾A
- 下一篇: android 骨骼动画库,cocos