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

Android使用FTP实现断点续传

断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载。用户可以节省时间,提高速度。

我们都知道Android下使用HTTP实现断点续传很容易。因为我们在发送下载请求给服务器后,服务器会将该文件的信息返回给我们。同时我们也可以设置发送文件的起始位置,让服务器从该位置开始传输文件。

简单介绍一下FTP(File Transfer Protocol)文件传输协议。用于Internet上的控制文件的双向传输。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

FTP没有所谓的头文件,刚接触到还是有点雾水的,不知从何下手。但是查询一下资料后,觉得还是挺简单的,只需要一个指令。多说无益,给大家举个栗子- -、

private Runnable mRunnable = new Runnable() {

@Override

public void run() {

try {

try {

ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器

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

} catch (Exception e) {

mHandler.sendEmptyMessage(DOWNLOAD_FAILED);

return;

}

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

return;

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

// 设置被动模式

ftpClient.enterLocalPassiveMode();

// 设置以二进制方式传输

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()) {// 存在,开始续传

localSize = file.length();

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

mHandler.sendEmptyMessage(DOWNLOAD_SUCCESS);

return;

}

// 从本地文件上续传

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”)设置字符编码,防止出现中文乱码现象

3. 获取本地已下载文件大小,然后使用ftpClient.setRestartOffset(localSize),可以开始断点续传了

FTP实现断点续传就这么简单完成了,逃。

ps:我使用jar包是Apache的commons-net。实现FTP断点续传,服务端的FTP也得支持断点续传的指令。 pps:功力有限,若有什么错误,请不吝赐教,谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教育行业的互联网焦虑症

2019独角兽企业重金招聘Python工程师标准>>> 文/阑夕 2007年&#xff0c;前新东方名师刘一男在新东方在线&#xff08;网校&#xff09;上的全年课程收入是三千元&#xff0c;四年之后的2011年&#xff0c;这个数字飙升到了四十万&#xff0c;已经和刘一男当年实体…

常见的几种RuntimeException

一般面试中java Exception&#xff08;runtimeException &#xff09;是必会被问到的问题常见的异常列出四五种&#xff0c;是基本要求。更多的。。。。需要注意积累了常见的几种如下&#xff1a;NullPointerException - 空指针引用异常ClassCastException - 类型强制转换异常。…

Android之Error: ‘L‘ is not a valid file-based resource name character解决办法

1、问题 Error:Execution failed for task :mergeBYODReleaseResources.> /home/chenyu/Android_dev/sangfor/yangzhoushizhenghu/20161229_M7.3_R3/EMM/Source/Android/aWork/res/drawable-mdpi/LOGO.png: Error: L is not a valid file-based resource name character: Fi…

零基础学人工智能:TensorFlow 入门例子

识别手写图片 因为这个例子是 TensorFlow 官方的例子&#xff0c;不会说的太详细&#xff0c;会加入了一点个人的理解&#xff0c;因为TensorFlow提供了各种工具和库&#xff0c;帮助开发人员构建和训练基于神经网络的模型。TensorFlow 中最重要的概念是张量&#xff08;Tenso…

TextView 多文字字体颜色及多事件监听

像微信朋友圈点赞功能如&#xff1a;张三、李四、王五、这种格式 最早做法是在layout中创建一个父类容器如linearlayout然后在创建一个子layout&#xff0c;在代码中 通过for循环addView添加到父类容器当中&#xff0c;虽然可以实现效果但是这样无形中会增加很多view控件。 通过…

CA周记 - 用 Visual Studio Code 做基于 .NET MAUI 跨平台移动应用开发

自2010年以来&#xff0c;移动应用开发是非常热门的一个方向&#xff0c;从技术上我们经历了原生应用开发、基于 H5 的 Web App、混合模式的移动应用开发&#xff0c;再到跨平台移动应用开发。.NET 不仅是一个跨平台的应用&#xff0c;也是一个跨应用场景的平台。.NET的移动应用…

P2P网络穿越 NAT穿越

http://blog.csdn.net/mazidao2008/article/details/4933730 —————————————————————————————————————————————————————————————— 穿越NAT的意义&#xff1a; NAT是为了节省IP地址而设计的&#xff0c;但它隐藏了…

Eclipse之如何快速查看抽象函数实现

1、ctrl (open implementation) 2、ctrl T

页面获取Spring Security登录用户

1.在session中取得spring security的登录用户名如下&#xff1a;${session.SPRING_SECURITY_CONTEXT.authentication.principal.username} spring security 把SPRING_SECURITY_CONTEXT 放入了session 没有直接把username 放进去。下面一段代码主要描述的是session中的存的变量&…

android 骨骼动画库,cocos creator spine骨骼动画组件使用

1: 掌握sp.Skeleton组件的使用;spine骨骼动画工具1: 骨骼动画: 把动画打散, 通过工具&#xff0c;调骨骼的运动等来形成动画2: spine是一个非常流行的2D骨骼动画制作工具3: spine 动画美术人员导出3个文件:(1) .png文件:动画的”骨骼”的图片集;(2).atlas文件: 每个骨骼在图片集…

border:none 与border:0的区别

border:none与border:0的区别体现为两点&#xff1a;一是理论上的性能差异&#xff0c;二是浏览器兼容性的差异。 性能差异&#xff1a; 【border:0;】把border设为“0”像素效果等于border-width:0&#xff0c;浏览器依然对border-width、border-color进行了渲染&#xff0c;即…

C#导入导出.CSV文件

欢迎您成为我的读者&#xff0c;希望这篇文章能给你一些帮助。前言大家好&#xff0c;我是阿辉。今天和大家一起来看看&#xff0c;C#在处理流文件时,我们最常用的导出Excel文件是如何操作的。在日常的业务编码过程中&#xff0c;很多时候需求就要求导出Office能打开的表格文件…

LeetCode之Sum of Left Leaves

1、题目 Find the sum of all left leaves in a given binary tree. Example: 3/ \9 20/ \15 7There are two left leaves in the binary tree, with values 9 and 15 respectively. Return 24.Subscribe to see which companies asked this question. 2、代码实现 /*** De…

华为电视鸿蒙系统好用吗,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼鸿蒙的厉害在于 你可能非用不可&#xfffc;瀑布先生06-05 09:52科技达人关注&#xfffc;华为一直在研发一套操作系统&#xff0c;如果不是对手打压。可能大部分人&#xff0c;至今都不知道这个系统的存在。如果市场稳定&#xff…

移动开发总结

meta基础知识 H5页面窗口自动调整到设备宽度&#xff0c;并禁止用户缩放页面 <meta name"viewport" content"widthdevice-width,initial-scale1.0,minimum-scale1.0,maximum-scale1.0,user-scalableno" /> 忽略将页面中的数字识别为电话号码 <met…

奋斗逼,真牛逼!

▲点击上方第二个findyi关注&#xff0c;回复“1”领取职场资料职场&认知洞察 丨 作者 / 易洋 这是findyi公众号的第304篇原创文章今天下午一个读者咨询我一个问题&#xff1a;这名读者感觉卷不过身边的加班狂人&#xff0c;但又感觉这些人丝毫不给公司创造价值&#xff0…

Entity Framework 批量插入

为什么80%的码农都做不了架构师&#xff1f;>>> 奋斗的小鸟——dogxuefeng Entity Framework 批量插入很慢 Entity Framework 批量插入很慢吗&#xff1f;我自己测试下 前几天看到一篇文章里提到过&#xff0c;在批量插入时&#xff0c;需要加上Context.Configur…

MYSQL分页limit速度太慢优化方法

当一个表数据有几百万的数据时&#xff0c;分页的时候成了问题如 select * from table limit 0,10 这个没有问题 当 limit 200000,10 的时候数据读取就很慢&#xff0c;可以按照一下方法解决最近一个网站的服务器评论被人刷死&#xff0c;导致mysql数据库异常发生too many open…

数据结构之求二叉树的所有叶子和以及叶子总数

1、题目 数据结构之求二叉树的所有叶子和以及叶子总数 2、代码实现 tree.java package leetcode.chenyu.test;public class Tree {int val;Tree left;Tree right;Tree(int val) {this.val = val;} } package leetcode.chenyu.test;public class TreeTest {public stat…

华为手机Android系统优缺点,第一次安卓机优缺点总结(对比iOS系统)

这次老婆换了x,换下来的7我都没用到&#xff0c;被丈母娘用了&#xff0c;我看着手上的6p&#xff0c;狠心换了华为Mate10Pro(6g,64g)。其实在一年前就开始关注华为的手机&#xff0c;对齐的性能了解主要来自网络媒体&#xff0c;外观认识主要来自身边朋友。从iOS转变到安卓&am…