最近工作中用到了 FTP 相关的操作,所以借此机会了解了下具体内容。

FTP基础

关于 FTP 基础推荐阅读《使用 Socket 通信实现 FTP 客户端程序》,其中需要特别注意的是主动模式和被动模式,这一部分在日常使用中经常被忽略,但生产环境中可能会出问题,关键在于防火墙对端口的控制。

主动模式:服务器采用 21 和 20 端口,客户端采用大于 1024 的随机端口,连接指令和文件传输指令由服务端发送。

被动模式:服务端采用 21 和大于 1024 的随机端口,客户端采用大于 1024 的随机端口,连接指令由客户端发送。

程序操作 FTP 过程在上面推荐的文章中有所提及,大家可以看到过程还是比较复杂的,不过好在有 apache 的 commons-net 给我们提供了相关的工具类可以使用,本文使用的是 3.6 版本。以下通过代码进行说明,此代码仅演示功能,很多地方并不完善,如果用作生产请自行修改。

Java FTP 上传

/**

* FTP发送至目标服务器

* @apiNote 依赖apache commons-net 包

* @param server

*/

public static void sendToServerByFTP(String server, int port, String username, String password,

String encoding, String fileLocalPath, String fileRemotePath, String fileRemoteName) throws IOException {

// 获取 FTPClient

FTPClient ftpClient = new FTPClient();

ftpClient.connect(server, port);

ftpClient.login(username, password);

int replyCode = ftpClient.getReplyCode();

if (!FTPReply.isPositiveCompletion(replyCode)) {

System.out.println("connected failed");

}

// 设置编码,当文件中存在中文且上传后文件乱码时可使用此配置项

//ftpClient.setControlEncoding(encoding);

// 切换为本地被动模式,可以解决FTP上传后文件为空的问题,但需要服务器将FTP服务添加至防火墙白名单

//ftpClient.enterLocalPassiveMode();

// 切换到指定目录

ftpClient.changeWorkingDirectory(fileRemotePath);

// 获取文件并上传

File file = new File(fileLocalPath);

InputStream inputStream = new FileInputStream(file);

//文件名为中文名且上传后出现乱码时启用此项

//String fileName = new String(fileRemoteName.getBytes(encoding), "ISO8859-1");

boolean flag = ftpClient.storeFile(fileRemoteName, inputStream);

// 关闭已占用资源

inputStream.close();

ftpClient.logout();

}

FTP 下载

FTP 下载和上传基本步骤类似,依赖的方法由 storeFile 变为 retrieveFile

public void downloadFile(String server, int port, String username, String password,

String serverPath, String localPath, String fileName) throws IOException {

// 登录

FTPClient ftpClient = new FTPClient();

ftpClient.connect(server, port);

ftpClient.login(username, password);

// 验证登录情况

int replyCode = ftpClient.getReplyCode();

if (!FTPReply.isPositiveCompletion(replyCode)) {

throw new RuntimeException("登录FTP服务器失败,错误代码:" + replyCode);

}

// 切换服务器至目标目录

ftpClient.changeWorkingDirectory(serverPath);

// 下载文件

File file = new File(localPath);

FileOutputStream fileOutputStream = new FileOutputStream(file);

ftpClient.retrieveFile(fileName, fileOutputStream);

// 关闭资源占用

fileOutputStream.close();

ftpClient.logout();

}

FTP 删除

public void deleteFile(String server, int port, String username, String password,

String serverPath, String fileName) throws IOException {

// 登录

FTPClient ftpClient = new FTPClient();

ftpClient.connect(server, port);

ftpClient.login(username, password);

// 验证登录情况

int replyCode = ftpClient.getReplyCode();

if (!FTPReply.isPositiveCompletion(replyCode)) {

throw new RuntimeException("登录FTP服务器失败,错误代码:" + replyCode);

}

ftpClient.changeWorkingDirectory(serverPath);

ftpClient.deleteFile(fileName);

}

java ftp详解_Java FTP 基本操作相关推荐

  1. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

  2. java 文件下载详解_Java 从网上下载文件的几种方式实例代码详解

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.github.pandafang.tool; import java.io.BufferedOutputStream; i ...

  3. java技术详解_Java反射技术详解及实例解析

    前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...

  4. java list详解_Java 中 list 用法案例详解

    LIST是个容器接口可以理解为动态数组,传统数组必须定义好数组的个数才可以使用,而容器对象无须定义好数组下标总数,用add()方法即可添加新的成员对象,他可以添加的仅仅只能为对象,不能添加基本数据类型 ...

  5. java unsafe 详解_Java CAS操作与Unsafe类详解

    一.复习 计算机内存模型,synchronized和volatile关键字简介 二.两者对比 sychronized和volatile都解决了内存可见性问题 不同点: (1)前者是独占锁,并且存在者上 ...

  6. java pattern详解_JAVA正则表达式:Pattern类与Matcher类详解

    以下我们就分别来看看这两个类: 一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1        ((A) ...

  7. java while详解_Java while循环-Java while-嗨客网

    Java while教程 在 Java语言while语句详解 语法 while(condition){ //do something } 参数 参数 描述 while while 条件判断关键字 co ...

  8. java classpath详解_java Classpath全解(转)

    java Classpath全解(转)[@more@]java 的新入门者对classpath往往比较困惑,为何在开发环境中能运行的东东出去就不好,或在外面运行的东东挺溜的进了开发环境就死菜,烦死了! ...

  9. java ftp详解_Java实现FTP文件上传详解

    import org.apache.commons.io.IOUtils; import org.apache.commons.net.ftp.FTPClient; import java.io.Fi ...

最新文章

  1. LinkedHashMap and LinkedHashSet
  2. android 快速启动,《Android APP可以有的东西》之显示篇:快速启动App
  3. WPF oxyPlot 使用总结
  4. Linux - 磁盘操作
  5. Javaassist简介
  6. Angular platform-server.js 里动态创建 JavaScript 标签页的场景
  7. 在Docker中运行asp.net core 跨平台应用程序
  8. python输出格式控制_Python3.x那些事儿:[50]多种多样的输出格式
  9. 计算机电脑的特点,计算机的五大特点是什么
  10. html中加入scrip代码,HTML script 标签 | 菜鸟教程
  11. css 外弧_css 弧度
  12. HDU1466 计算直线的交点数
  13. 嘉立创显示板子没有发现外型数据
  14. 原生jsonp发送跨域请求
  15. 如何解决第三方JavaScript引入工程后报错
  16. 【TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】
  17. 【PAT】A-1076:Forwards on Weibo(有向图的BFS遍历)
  18. php mysql多条件查询界面_PHP组合查询多条件查询实例代码
  19. c语言枚举法在单片机的应用领域,当前单片机主要应用在哪些领域?
  20. 基于Matlab对三自由度并联机构的正逆解

热门文章

  1. tf.maximun(a,b)_tf.minimum(a,b)
  2. windows7C盘减少,瘦身
  3. 04741自考计算机网络原理知识点总结、考点串讲、考前复习
  4. Web应用安全————账号冻结与 Session 实时失效
  5. curl命令使用大全
  6. [Java]_[初级]_[如何调用外部命令获取输出并设置它的超时退出]
  7. 如何使用Altium Designer官方元器件集成库
  8. C SHARP 函数 枚举
  9. arduino和单片机的区别,arduino好还是单片机好?
  10. 【汇正财经】如何进行股票板块的热点判断?