1. 使用方法:
  2. FTPClient client = new FTPClient();
  3. client.connect("ftp.host.com", 8021);
  4. client.login("carlo", "mypassword");
  5. 没有异常表示连接成功,否则会垫子抛出FTPException异常。
  6. 当然还有一些重载方法,如果端口为21就可以用client.connect(host);
  7. 为了处理匿名的登录,可以client.login("anonymous", "ftp4j");,用户名是anonymous,密码随意。
  8. 登录之后需要对服务器进行操作,如目录显示,进入等;
  9. String dir = client.currentDirectory(); 显示当前目录
  10. 修改进入的目录
  11. client.changeDirectory(newPath);
  12. 可以使用相对路径,也可以使用绝对路径,下面两种都可以。
  13. client.changeDirectory("/an/absolute/one");
  14. client.changeDirectory("relative");
  15. 如果只想进入上一层:client.changeDirectoryUp();
  16. ftp4j中有两个特别目录“.","..",分别表示根目录与上一层目录。
  17. 重命名:client.rename("oldname", "newname");
  18. 或移动文件:client.rename("myfile.txt", "myfolder/myfile.txt");
  19. 删除文件:client.deleteFile(relativeOrAbsolutePath);可以使用相对或绝对路径。
  20. 创建目录:client.createDirectory("newfolder");
  21. 删除目录:client.deleteDirectory(absoluteOrRelativePath);
  22. 显示文件,目录,链接
  23. 由于服务器的不同,所以返回的文件列表格式也不同,可能是UNIX,也可能是WIN的。ftp4j目录支持:
  24. UNIX style and variants (i.e. MAC style)
  25. DOS style
  26. NetWare styles
  27. EPLF
  28. MLSD
  29. .显示当前的目录文件:FTPFile[] list = client.list();
  30. FTPFile包含了所需要的信息,从type可以知道是目录还是文件,或链接。
  31. 除此外还可以过滤:
  32. FTPFile[] list = client.list("*.jpg");过滤了,只显示图片
  33. 如果想知道修改上期,需要单独获取,不能从上面的list()方法得到:
  34. java.util.Date md = client.modifiedDate("filename.ext");
  35. 接下来就是上传与下载了:
  36. client.download("remoteFile.ext", new java.io.File("localFile.ext"));
  37. client.upload(new java.io.File("localFile.ext"));
  38. 追加内容的上传
  39. client.append(new java.io.File("localFile.ext"));
  40. 这些是阻塞方法,只有在完成后才返回,所以一个FTPClient只能在同时进行一个传输。如果你想多个文件同时传输,可以使用多个FTPClient,FTPClient单独连接服务器。
  41. 当今的软件不能只是功能上实现了,还需要注意用户体验,所以上传下下载需要知道进度,ftp4j都通过FTPDataTransferListener这个接口来实现的,如果有一个方法:
  42. public void transferred(int length) {
  43. // Yet other length bytes has been transferred since the last time this
  44. 这个方法是说在距上一次传输到这一次传输的内容多少,
  45. 如果要有一个进度条,需要知道总量,然后当前传输的量,所以需要进行一些处理,如在开始上传时,获取本地文件上传大小,然后从这个接口中得到已经传输的文件叠加起来得到已经传输文件总量的大小,再计算得到进度。
  46. 从FTPClient中可以知道:在上传时:listener.transferred(l);l表示这次传输的量,但这似乎不是我们想要的,
  47. 修改为:listener.transferred(done);这个done表示的是上传的总量,是已经存在的,直接使用就好了。
  48. }
  49. 然后就可以通过重载方法加入这个监听器client.download("remoteFile.ext", new java.io.File("localFile.ext"), new MyTransferListener());,其它略了。
  50. 对同一个FTPClient,多个线程间的操作是有影响的,如可以在其它线程中调用abortCurrentDataTransfer()来结当前的传输行为。
  51. 这个方法传入 false表示突然停止,传入true表示发送ABOR命令,是个合法的结束。然后会有FTPAbortedException异常。
  52. ftp4j还支持断点:
  53. client.download("remoteFile.ext", new java.io.File("localFile.ext"), 1056);表示从1057开始,前面的不需要再传输了。
  54. 上传也类似 。
  55. 主动与被动的传输:
  56. 主动的传输行为:
  57. 客户端发送ip地址与端口号到服务器
  58. 客户端请求服务器传输数据,开始监听端口
  59. 服务器连接地址与端口
  60. 数据传输由一个新的通道开始传输。
  61. 主动的需要客户端支持接收信息如果客户端有防火墙,代理等,会有些问题,
  62. 被动的传输行为:
  63. 客户端请求服务器准备被动的数据传输。
  64. 服务器回复并带有ip与端口。
  65. 客户端请求传输也连接。
  66. 数据传输由一个新的通道开始传输。
  67. 通过以下方式改变:
  68. client.setPassive(false); // Active mode
  69. client.setPassive(true); // Passive mode
  70. 默认是被动的。
  71. 这些属性可以通过系统属性来设置 :
  72. 如ftp4j.activeDataTransfer.acceptTimeout设置超时时间:
  73. java -Dftp4j.activeDataTransfer.hostAddress=178.12.34.167
  74. -Dftp4j.activeDataTransfer.portRange=6000-7000
  75. -Dftp4j.activeDataTransfer.acceptTimeout=5000 MyClass
  76. Set property values directly in the code. I.e.:
  77. System.setProperty("ftp4j.activeDataTransfer.hostAddress", "178.12.34.167");
  78. System.setProperty("ftp4j.activeDataTransfer.portRange", "6000-7000");
  79. System.setProperty("ftp4j.activeDataTransfer.acceptTimeout", "5000");
  80. 二进制与文本传输类型:
  81. 从源码可以看出是以后缀名来判断文件的类型,所以个人认为,上传的文件需要自己知道什么类型的,不小心将二进制文件改为txt后缀,可能会有些问题。
  82. client.setType(FTPClient.TYPE_TEXTUAL);
  83. client.setType(FTPClient.TYPE_BINARY);
  84. client.setType(FTPClient.TYPE_AUTO);
  85. 当然它提供了一些自定义的类型client.setTextualExtensionRecognizer(myRecognizer);
  86. 一些服务器支持数据压缩传输,叫MODE Z。可以通过client.setCompressionEnabled(true);打开,在这之前可以确认:boolean compressionEnabled = client.isCompressionEnabled();
  87. 站点规范与命令:
  88. FTPReply reply = client.sendSiteCommand("YOUR COMMAND");
  89. 也可以自定义命令
  90. FTPReply reply = client.sendCustomCommand("YOUR COMMAND");
  91. 都返回一个FTPReply对象。可以从这个对象得到一些返回代码,信息等内容。
  92. -----------------------------------------------
  93. 上面是ftp4j的文档的一些知识。有了以上知识,开发一个android客户端就相对容易多了。
  94. 如我想得到服务器的文件目录操作(选择文件,选择目录,进入目录)
  95. 就可以使用ListView+ListAdapter显示目录与文件,然后由于 android的操作可以使用OnItemLongClickListener长按与短按OnItemClickListener分别指定一些操作,如短按可以选择为进入目录:
  96. public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
  97. FTPFile ftpFile=mFileList.get(i);
  98. String filename=ftpFile.getName();
  99. if ("..".equals(filename)) {
  100. Log.d(TAG, "change directory up.");
  101. changeDirectoryUp();
  102. else if (".".equals(filename)) {
  103. Log.d(TAG, "change directory root");
  104. changeDirectory("/");
  105. else {
  106. if (ftpFile.getType()==FTPFile.TYPE_DIRECTORY) {
  107. Log.d(TAG, "change directory:"+filename);
  108. changeDirectory(filename);
  109. }
  110. }
  111. }
  112. mFtpClient.changeDirectory(path);
  113. mFtpClient.changeDirectoryUp();就是上面最终调用的方法。
  114. 然后在长按中:
  115. FTPFile ftpFile=mFileList.get(i);
  116. String filename=ftpFile.getName();
  117. if ("..".equals(filename)||".".equals(filename)) {
  118. Log.d(TAG, "在这里没有处理");
  119. else {
  120. if (ftpFile.getType()==FTPFile.TYPE_DIRECTORY) {
  121. Log.d(TAG, "change directory:"+filename);
  122. selectDirectory(filename);
  123. }
  124. }
  125. selectDirectory()方法就是作为选中目录上传目的地。然后可以将本地文件传入这个目录。
  126. 在改变目录后调用:
  127. private void refreshFiles(FTPClient mFtpClient) throws IOException, FTPIllegalReplyException, FTPException {
  128. FTPFile[] files=new FTPFile[0];
  129. try {
  130. files=mFtpClient.list();
  131. List<FTPFile> ftpFiles=(List<FTPFile>) Arrays.asList(files);
  132. mFileList.clear();
  133. mFileList.addAll(ftpFiles);
  134. Message message=Message.obtain(mHandler, REFRESH_FILE);
  135. message.obj=mFtpClient.currentDirectory();
  136. mHandler.sendMessage(message);
  137. //这里就是刷新ListView。
  138. catch (FTPDataTransferException e) {
  139. e.printStackTrace();
  140. catch (FTPAbortedException e) {
  141. e.printStackTrace();
  142. catch (FTPListParseException e) {
  143. e.printStackTrace();
  144. }
  145. }
  146. 提供了上传下载的功能后,就可以使用它了,建立一个简单的ftp服务器,HOMEftpserver就是个不错的东西,然后拍照或录像再上传。其它就不说了,直接传代码上来。完成的程序可以使用,只是有些简陋,仅供参考。目前的需求就是拍照来录像后上传到ftp。

ftpj4下载地址:http://www.sauronsoftware.it/projects/ftp4j/download.php:ftp4j 1.7.1 发布,Java 的 FTP 客户端类库

ftp4j 1.7.1 发布,该版本为 FTPConnector 新增 setUseSuggestedAddressForDataConnections() 方法用于决定是否信任服务器的通过 PASV 命令返回的地址,修复了自动 noop 定时器的bug,调用 SimpleDateFormat 改为线程安装模式,改进了数据传输程序以兼容更多的服务器和代理服务器。

ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能。可以将ftp4j嵌到你的Java应用中,来传输文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。

ftp4j 1.7 发布了,主要改进内容包括:

  • 对 FTP 连接器架构的修改
  • FTPConnector 不再是个接口,改成了抽象类,实现了一些具有超时检测的连接
  • 调用者可设置连接、读取和关闭操作的超时时间
  • 提供中断连接的方法,FTPClient.abortCurrentConnectionAttempt();
  • 修复了 HTTPTunnelConnector 中的 bug

http://www.sauronsoftware.it/projects/ftp4j/download.php

http://blog.csdn.net/dahuaishu2010_/article/details/7640768

android ftp案例分析的更多相关文章

  1. android ANR 案例分析

    案例1:关键词:ContentResolver in AsyncTask onPostExecute, high iowait Process:com.android.email Activity:c ...

  2. Week2 Bing词典Android客户端案例分析

    一.软件调研 运行平台:Android 4.4.4 必应版本:5.2.2 1.bug发现 1.1 bug标题:单词挑战无法加载和刷新 bug详细描述:学习界面中的单词挑战模块,点击后没有任何反映,并且 ...

  3. 软件工程第4次作业------石墨文档Android客户端案例分析

    作业要求的博客链接:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505 分析产品:石墨文档Android客户端 第一部分 调研和评测 1. ...

  4. 第四次作业——关于石墨文档(Android)客户端的案例分析

    关于石墨文档(Android)客户端的案例分析 作业地址:[https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505] 第一部分调研,评测 1. ...

  5. 098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类

    098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类 本文知识点:编写并测试Subject类 说明: ...

  6. 099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类

    099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类 本文知识点:编写并测试Subject类 说明: ...

  7. 101 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 05 通过方法实现学生类与专业类关联——方案二

    101 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 05 通过方法实现学生类与专业类关联--方案二 本文知识点:通过方法实现学生类与 ...

  8. 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析

    作者:唐老师,华清远见嵌入式学院讲师. 通过前两节HAL框架分析和JNI概述,我们对Android提供的Stub HAL有了比较详细的了解了,下面我们来看下led的实例,写驱动点亮led灯,就如同写程 ...

  9. Android APP性能分析方法及工具

    近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...

随机推荐

  1. Java学习日记-10 集合

    集合(Collection) 1. 什么是集合? 集合是一组对象组成的一个整体,又称为容器,集合类属于java.util包.集合不同于数组的地方在于,一是它的容量是可变的,二是集合中只能存储对象,不能 ...

  2. 【树形动态规划】【CTSC1997】选课 解题报告

    CTSC1997-选课 描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这 ...

  3. iOS APP之本地数据存储(译)

    最近工作中完成了项目的用户信息本地存储,查阅了一些本地存储加密方法等相关资料.期间发现了一个来自印度理工学院(IIT)的信息安全工程师的个人博客,写了大量有关iOS Application secur ...

  4. SpringMVC 自定义拦截资料

    1.springmvc学习笔记(28)——自定义拦截器 2.Spring MVC HandlerInterceptor Annotation Example with WebMvcConfigurer ...

  5. poj 3046 Ant Counting (DP多重背包变形)

    题目:http://poj.org/problem?id=3046 思路: dp [i] [j] :=前i种 构成个数为j的方法数. #include <cstdio> #include ...

  6. ios开发应用内实现多语言自由切换

    需求描述:应用内部有一按钮,点击切换语言(如中英文切换).说起来这个是好久以前做的一个功能点了,刚开始也是没有头绪,后来解决了发现很简单,把方法分享一下.1.原理.查看NSLocalizedStrin ...

  7. linux下清理系统垃圾

    可以使用以下命令清理系统垃圾sudo apt-get autoclean 清理旧版本的软件缓存sudo apt-get clean 清理所有软件缓存sudo apt-get autoremove 删除 ...

  8. JAVA - 回调机制

    参考例子:android的Button OnClickListener接口.<第一行代码>中的回调例子   定义接口 public interface HttpCallbackListen ...

  9. MM32初识(兼容STM32)

    MM32初识(兼容STM32) 资源与开发环境 keil 5.0 MM32 miniboard 提要 stm32入门(MM32兼容) 点亮LED思路简介 GPIO配置 stm32寄存器理解与操作步骤 ...

  10. 95秀-dialog 进度对话框 实用工具

    工具Util public class DialogUtil {     public static ProgressDialogView progressDialog;     /**      * ...