Java FTP操作
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操作的更多相关文章
- [Java] 使用 Apache的 Commons-net库 实现FTP操作
因为最近工作中需要用到FTP操作,而手上又没有现成的FTP代码.就去网上找了一下,发现大家都使用Apache的 Commons-net库中的FTPClient. 但是,感觉用起来不太方便.又在网上找到 ...
- 用edtftpj实现Java FTP客户端工具
edtftpj是一个java FTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活.edtftpj有多种版本,分别是java..net和js版本.对于Java版的有一个免费版本. ...
- Java文件操作源码大全
Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...
- 关于Java FTP SFTP的相关实际问题
第一个: java ftp使用的是Apache common-net,但是FTP服务侧提供的FTP服务器只支持SFTP,结果报 java.net.ConnectException: Connectio ...
- Java FTP 基本操作
最近工作中用到了 FTP 相关的操作,所以借此机会了解了下具体内容. FTP基础 关于 FTP 基础推荐阅读<使用 Socket 通信实现 FTP 客户端程序>,其中需要特别注意的是主动模 ...
- Java FTP客户端开源类库 edtFTPj
edtFTPj/Free是免费的流行的Java FTP库,全球公司依靠edtFTPj /Free 为它们的Java应用程序添加FTP客户端功能. (收费的支持SFTP.FTPS的edtFTPj/PRO ...
- Java实现操作dos命令
java实现操作dos命令的两种方式 1.读取文件中的命令 package com; import java.io.InputStream; public class cmd { public sta ...
- JAVA 链表操作:循环链表
主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...
- java日期操作大全
摘自(http://www.blogjava.net/i369/articles/83483.html) java日期操作 大全 先来一个: 取得指定月份的第一天与取得指定月份的最后一天 http ...
- Java CSV操作(导出和导入)
Java CSV操作(导出和导入) CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件 ...
随机推荐
- Codeforces Round #700 (Div. 2) A~C题解
写在前边 链接:Codeforces Round #699 (Div. 2) A. Yet Another String Game 链接:A题链接 题目大意: 给定一个字符串,有两位同学来操作这个字符 ...
- 基于TensorFlow 2与PaddlePaddle 2预测泰坦尼克号旅客生存概率的比较
目录 1,程序比较 2,训练过程对比: 3,训练结果对比 AI框架经过大浪淘沙之后,目前真正能够完整用于生产.科研.学术的只剩下了谷歌.脸书.百度三家的框架,本文通过一个泰坦尼克号旅客生存概率预 ...
- Serializable是什么?为什么在Entity层要实现Serializable接口
我在做房产信息管理系统时用到了Serializable接口 Serializable含义: 一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化. Serializ ...
- 记一次逆向分析解密还原Class文件
前言 前阵子我的一位朋友发来一份代码让我帮忙看看.具体就是所有的jsp文件内容和大小都一样,漏洞挖掘无从下手.经过分析发现所有的Class都使用了自定义的加密工具加密,经过逆向分析,顺利解密,因而有了 ...
- Macbook磁盘系统结构/文件/目录介绍分析
1. 系统磁盘根目录详解: 1.1 磁盘根目录结构 / (根目录)|-- Applications # 存放应用程序|-- Users # 存放用户文件和设置|-- cores # 存放核心转储文件, ...
- 【布局技巧】Flex 布局下居中溢出滚动截断问题
在页面布局中,我们经常会遇到/使用这么一类常见的布局,也就是列表内容水平居中于容器中,像是这样: <ul class="g-contaner"> <li>& ...
- Grafana系列-Loki-基于日志实现告警
系列文章 Loki 系列文章 前言 实际应用中除了基于 Metrics 告警, 往往还有基于日志的告警需求, 可以作为基于 Metrics 告警之外的一个补充. 典型如基于 NGINX 日志的错误率告 ...
- MybatisPlus查询时过滤不需要的字段~
解释一下:乍一看标题可能有点懵~,其实就是想查询的时候过滤掉某些字段 例如: select name,email,password from user; --改为-> select name,e ...
- 一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults
本文基于内核 5.4 版本源码讨论 在前面两篇介绍 mmap 的文章中,笔者分别从原理角度以及源码实现角度带着大家深入到内核世界深度揭秘了 mmap 内存映射的本质.从整个 mmap 映射的过程可以看 ...
- java方法的定义与执行
java中的方法在类中定义. 定义方法格式: 访问修饰符 返回值类型 方法名(参数列表){ ... 执行内容 ... return 返回值; } 访问修饰符:表示方法在哪里能被 ...