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. SQL 语言标准简介

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 一.简介 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是 ...

  2. python简介和基本数据类型

    今天是2018年12月7日,开始python的学习,现在将知识点总结如下: 1  python语言有2个版本分别是 python2 .python3    区别还是很大的,例如 python2 中 1 ...

  3. 路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法的思想是广度优先搜索(BFS) 贪心策略. 是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数 如果是负数,则需要 Bellman-Fo ...

  4. VCS用法

    1.时钟频率点击,鼠标左键点击波形上升沿,中间滚轮点击,然后选择hz,就显示当前信号时钟频率. 2.窗口乱掉,找不到文件列表,右下角点击弹出选择instance. 3.bus地址查找,选择信号,然后蓝 ...

  5. [THUPC 2023 初赛] 背包

    题目描述 本题中,你需要解决完全背包问题. 有 \(n\) 种物品,第 \(i\) 种物品单个体积为 \(v_i\).价值为 \(c_i\). \(q\) 次询问,每次给出背包的容积 \(V\),你需 ...

  6. Cocos内存管理解析 CCRef/retain/release/autorelease

    Cocos内存管理源码(autorelease解析) 背景 这段时间在做项目的时候,需求需要往spine动作的挂点上绑定按钮节点,由于按钮在编辑器中是加在已有节点上的,所以在往spine上添加挂点时, ...

  7. 华企盾DSC手机app注册保存成功登录时一直转圈

    可能是花生壳等映射软件不稳定,重启一下花生壳等工具

  8. C++ Qt开发:SqlTableModel映射组件应用

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlTabl ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (169)-- 算法导论13.2 2题

    二.用go语言,证明:在任何一棵有 n 个结点的二叉搜索树中,恰有 n-1种可能的旋转. 文心一言: 要证明在任何一棵有 n 个结点的二叉搜索树中,恰有 n-1 种可能的旋转,我们可以按照以下步骤逐步 ...

  10. vulnhub - Aragog - writeup

    信息收集 目标开放了80.22端口. root@Lockly temp/tmp » arp-scan -I eth1 -l Interface: eth1, type: EN10MB, MAC: 00 ...