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. Node.js精进(12)——ElasticSearch

    ElasticSearch(简称 ES)是一款基于 Lucene 的分布式.可扩展.RESTful 风格的全文检索和数据分析引擎,擅长实时处理 PB 级别的数据. 一.基本概念 1)Lucene Lu ...

  2. 查看API官方文档

    盛年不重来,一日难再晨.及时宜自勉,岁月不待人.   学习一门语言, 了解其开发文档必不可少.开发文档就是我们在编程开发.维护.升级过程中的参考最全面.最权威的资料.我认为就是开发者为后人方便理解留下 ...

  3. 【Javaweb】Servlet五 | HTTP协议【详解】

    什么是HTTP协议 什么是协议? 协议是指双方或多方相互约定好,大家都需要遵守的规则,叫协议. 所谓HTTP协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫做HTTP协议. HT ...

  4. Android的内部存储和外部存储怎么区分?

    1.定义 内部存储:内部存储位于Android手机系统的data/data/<包名>这个目录下,内部存储是私有的,主要用于存储系统和应用程序的某些数据,对于其他应用程序来说是不可见的,并且 ...

  5. TPC-DS工具介绍及性能测试

    一. Hive-testbench工具介绍 TPC-DS:https://www.cnblogs.com/webDepOfQWS/p/10544528.html 由于原生态工具生产测试数据表存在bug ...

  6. TCP传输层详解(计算机网络复习)

    介绍:TCP/IP包含了一系列的协议,也叫TCP/IP协议族,简称TCP/IP.该协议族提供了点对点的连接机制,并将传输数据帧的封装.寻址.传输.路由以及接收方式都予以标准化 TCP/IP的分层模型 ...

  7. ez_curl【代码审计】

    ez_curl[代码审计][难度:4] 题目描述 代码审计类题目,附上代码: <?php highlight_file(__FILE__); $url = 'http://back-end:30 ...

  8. 封装Detours用于Python中x64函数hook

    Detours 代码仓库: https://github.com/microsoft/Detours x64写一个任意地址hook要比x86麻烦的多,所以这里直接封装框架来用于x64的hook. De ...

  9. Pulsar3.0 升级指北

    Pulsar3.0 介绍 Pulsar3.0 是 Pulsar 社区推出的第一个 LTS 长期支持版本. 如图所示,LTS 版本会最长支持到 36 个月,而 Feature 版本最多只有六个月:类似于 ...

  10. 华企盾DSC导致导出文件报错常见处理方法

    1.导出文件的进程和打开该文件的进程启用OLE控制是否都是未勾选,以及启用虚拟重定向是否设置一致(要么都勾选要么都不勾) 2.用procmon监控个人模式下导出非加密的文件,搜索writefile的进 ...