pom引用:

        <dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency> <dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>

代码:

package com.suncreate.wifi.tool;

import org.apache.commons.io.IOUtils;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.*;
import java.util.ArrayList;
import java.util.List; @Service
public class FtpUtils { private static final Logger LOGGER = LoggerFactory.getLogger(FtpUtils.class); private static final String SEPARATOR_CHAR = "/"; private static final String CURRENT_DIR_CHAR = "."; private static final String PARENT_DIR_CHAR = ".."; private static FTPClient ftp = new FTPClient(); private List<String> fileNameList = new ArrayList<>(); public List<String> getFileNameList() {
return fileNameList;
} @PostConstruct
public void init() {
login("127.0.0.1", 21, "admin", "123456");
} @PreDestroy
public void destroy() {
disConnection();
} public FtpUtils() {
} /**
* 重载构造函数
*
* @param isPrintCommmand 是否打印与FTPServer的交互命令
*/
public FtpUtils(boolean isPrintCommmand) {
if (isPrintCommmand) {
ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
}
} /**
* 登陆FTP服务器
*
* @param host FTPServer IP地址
* @param port FTPServer 端口
* @param username FTPServer 登陆用户名
* @param password FTPServer 登陆密码
* @return 是否登录成功
* @throws IOException
*/
public boolean login(String host, int port, String username, String password) {
if (ftp.isAvailable()) {
return true;
}
try {
ftp.connect(host, port);
} catch (IOException e) {
LOGGER.error("can not connect ftp!", e);
}
if (FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
try {
if (ftp.login(username, password)) {
ftp.enterLocalPassiveMode();
ftp.setControlEncoding("UTF-8");
ftp.setFileType(FTP.BINARY_FILE_TYPE);
return true;
}
} catch (IOException e) {
LOGGER.error("can not login ftp!", e);
}
}
return false;
} /**
* 清空集合
*/
public void clearList() {
fileNameList.clear();
} /**
* 关闭数据链接
*
* @throws IOException
*/
public void disConnection() {
try {
if (ftp.isConnected()) {
ftp.logout();
ftp.disconnect();
LOGGER.info("close ftp connection success!");
}
} catch (IOException e) {
LOGGER.error("close ftp connection failed!", e);
}
} /**
* 递归遍历目录下面指定的文件名
*
* @param pathName 需要遍历的目录,必须以"/"开始和结束
* @param ext 文件的扩展名
* @throws IOException
*/
public void listFileName(String pathName, String ext) {
if (pathName.startsWith(SEPARATOR_CHAR) && pathName.endsWith(SEPARATOR_CHAR)) {
//更换目录到当前目录
FTPFile[] files = new FTPFile[]{};
try {
ftp.changeWorkingDirectory(pathName);
files = ftp.listFiles();
} catch (IOException e) {
LOGGER.info("traverse ftp dir failed!", e);
}
for (FTPFile file : files) {
if (file.isFile()) {
if (file.getName().endsWith(ext)) {
fileNameList.add(pathName + file.getName());
}
}
}
}
} /**
* 目录下面是否存在指定的文件
*/
public int fileExist(String pathName) {
int length = 0;
//更换目录到当前目录
try {
ftp.changeWorkingDirectory(pathName);
FTPFile[] ftpFiles = ftp.listFiles(pathName);
length = ftpFiles.length;
} catch (IOException e) {
e.printStackTrace();
}
return length;
} /**
* 遍历文件
*
* @param pathName 根路径
*/
public void listFileName(String pathName) {
listFileName(pathName, "zip");
} /**
* 获取图片流
*
* @param ftpPath 根路径
*/
public byte[] downloadFtpFile(String ftpPath) {
byte[] file = null;
InputStream inputStream = null;
try {
inputStream = ftp.retrieveFileStream(ftpPath);
file = IOUtils.toByteArray(inputStream);
} catch (Exception e) {
LOGGER.error("download ftp failed!", e);
} finally {
if (null != inputStream) {
try {
inputStream.close(); if (ftp.completePendingCommand()) {
LOGGER.info("download fileName={} success!", ftpPath);
} else {
LOGGER.warn("download fileName={} failed!", ftpPath);
}
} catch (IOException e) {
LOGGER.error("close ftp inputStream failed!", e);
}
}
}
return file;
} /**
* 删除ftp上的文件
*
* @param ftpFileName
* @return true || false
*/
public boolean removeFtpFile(String ftpFileName) {
boolean flag = false; try { flag = ftp.deleteFile(ftpFileName);
if (flag) {
LOGGER.info("delete fileName={} success!", ftpFileName);
} else {
LOGGER.warn("delete fileName={} failed!", ftpFileName);
}
} catch (IOException e) {
LOGGER.error("delete file failed!", e);
}
return flag;
} public static void main(String[] args) {
System.out.println(System.getProperty("user.dir"));
return; /*
FtpUtils ftpUtils = new FtpUtils(); ftpUtils.login("34.8.8.206", 21, "admin", "admin"); ftpUtils.listFileName("/D:/ftproot/2019gakm/");
ftpUtils.listFileName("/D:/ftproot/2019yryp/");
for (String arFile : ftpUtils.getFileNameList()) {
System.out.println("filename=" + arFile);
byte[] file = ftpUtils.downloadFtpFile(arFile);
System.out.println("bytefile=" + file);
}
ftpUtils.disConnection();*/
}
}

Java FTP操作的更多相关文章

  1. [Java] 使用 Apache的 Commons-net库 实现FTP操作

    因为最近工作中需要用到FTP操作,而手上又没有现成的FTP代码.就去网上找了一下,发现大家都使用Apache的 Commons-net库中的FTPClient. 但是,感觉用起来不太方便.又在网上找到 ...

  2. 用edtftpj实现Java FTP客户端工具

    edtftpj是一个java FTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活.edtftpj有多种版本,分别是java..net和js版本.对于Java版的有一个免费版本. ...

  3. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...

  4. 关于Java FTP SFTP的相关实际问题

    第一个: java ftp使用的是Apache common-net,但是FTP服务侧提供的FTP服务器只支持SFTP,结果报 java.net.ConnectException: Connectio ...

  5. Java FTP 基本操作

    最近工作中用到了 FTP 相关的操作,所以借此机会了解了下具体内容. FTP基础 关于 FTP 基础推荐阅读<使用 Socket 通信实现 FTP 客户端程序>,其中需要特别注意的是主动模 ...

  6. Java FTP客户端开源类库 edtFTPj

    edtFTPj/Free是免费的流行的Java FTP库,全球公司依靠edtFTPj /Free 为它们的Java应用程序添加FTP客户端功能. (收费的支持SFTP.FTPS的edtFTPj/PRO ...

  7. Java实现操作dos命令

    java实现操作dos命令的两种方式 1.读取文件中的命令 package com; import java.io.InputStream; public class cmd { public sta ...

  8. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  9. java日期操作大全

    摘自(http://www.blogjava.net/i369/articles/83483.html) java日期操作 大全 先来一个:  取得指定月份的第一天与取得指定月份的最后一天  http ...

  10. Java CSV操作(导出和导入)

    Java CSV操作(导出和导入)  CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件 ...

随机推荐

  1. 为什么FPGA中推荐使用独热码?

    独热码只有一个比特位不同,所以在进行比较的时候: 假如我们要判断状态机是否处于某状态S1,代码如下 格雷码:assign S1 = (STATUS == 2'b01) 二进制码:assign S1 = ...

  2. Android Sutdio 编入System API 等隐藏API 方法

    1. 将 classes.jar 放入 app/libs 文件夹下 右键点击 jar 包,点击 Add as Library 2. 项目级 Gradle 文件新增以下配置 gradle.project ...

  3. MongoDB 中的事务

    MongoDB 事务 前言 如何使用 事务的原理 事务和复复制集以及存储引擎之间的关系 WiredTiger 中的事务隔离级别 WiredTiger 事务过程 事务开启 事务执行 事务提交 事务回滚 ...

  4. PLC 和Modbus/串口设备现场总线通信及短信报警解决方案

    在实现 Modbus 设备与 PROFIBUS DP 协议 PLC 通讯的同时可以在手机端实时的接收报警短信,使客户足不出户了解设备与 PLC 的状态,及时处理现场中的问题. 系统组成 Modbus ...

  5. React 中事件处理

    不要问自己需要什么样的人生,而要问自己想要成为什么样的人. 我们从前面的学习知道一个 React 组件不仅仅只包含 DOM 结构的,还应该样式和 Javascript 逻辑的.这里我们认识逻辑构造之事 ...

  6. Codeforces Round #691 (Div. 2) D - Glass Half Spilled(DP)

    题目 补下因实验漏掉的CF(还以为是晚上,没想到是下午开始).前三题过的很顺利,到D题时想了会发现数据很小爆搜貌似能过,就以为是道水题,交了一发T了,胡乱加了点剪枝还是T.逐渐意识到事情的严重性.考虑 ...

  7. centos虚拟机安装

    目录 一.准备工作 1.vmware workstation软件安装 2.准备ios镜像 二.创建Centos虚拟机 三.进行Centos7的系统安装 四.虚拟机快照的使用 1.创建虚拟机快照 2.还 ...

  8. 搭建一个简易的IPv6网络测试环境

    背景 近期一个项目要求产品在IPv6网络环境部署,在此之前所有的项目网络环境都是IPv4,为了验证产品网络适配能力,需要搭建一套IPv6的网络测试环境,网上搜了很多教程,也在某东找了很多路由器,对于如 ...

  9. [USACO2022OPENS] Visits

    题目描述 Bessie 的 \(N\)(\(2\le N\le 10^5\))个奶牛伙伴(编号为 \(1\cdots N\))每一个都拥有自己的农场.对于每个 \(1\le i\le N\),伙伴 i ...

  10. 使用C++和QT实现Log自定义日志系统

    MyLog 说明 使用QT的qInstallMessageHandler函数结合qDebug,qInfo实现自定义的日志系统 输出日志到文件和控制台 自动检测日志文件大小 自动更新日志文件修改日期 自 ...