基于Java手写一个好用的FTP操作工具类
作者:洛阳泰山 发布时间:2021-06-05 20:10:18
标签:Java,FTP,操作,工具类
前言
网上百度了很多FTP的java 工具类,发现文章代码都比较久远,且代码臃肿,即使搜到了代码写的还可以的,封装的常用操作方法不全面,于是自己花了半天实现一个好用的工具类。最初想用java自带的FTPClient 的jar 去封装,后来和apache的jar工具包对比后,发现易用性远不如apache,于是决定采用apache的ftp的jar 封装ftp操作类。
windows服务器搭建FTP服务
打开控制版面,图示win 10为例。
点击程序
选择 启用或者关闭Windows 功能
勾选启用 Internet Information Services 下FTP相关服务和 IIS 管理控制平台还有万维网服务 后,点击确定。
打开 IIS管理器
选中网站,鼠标右键 ,添加 FTP 站点
添加 网站名称,选择本地物理路径 ,设置完毕,点击。
填写自己的内网ip,选择 无 SSL,点击下一步。
勾选匿名 (访问时候不需要账户密码验证),允许所有用户 ,选择 读取 和写入权限(根据自己需求选择),点击完成。
同一内网的任何电脑的文件夹 内输入 自己设置的ip和端口 ftp://ip:port ,即可访问。
工具类方法
账户密码登录方法
无账号密码登录方法
字符转码方法
判断文件目录是否存在方法
获取文件列表方法
上传文件方法
下载文件方法
上传文件夹方法
下载文件夹方法
删除文件方法
删除文件夹方法
创建文件夹方法
文件重命名方法
代码展示
pom文件引入依赖关系 commons-net jar
<!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
工具类完整代码
import org.apache.commons.net.ftp.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* Java FTP工具类
*/
public class FTPUtil {
private static FTPClient ftp;
/**
* 方法描述: 转码
*/
private static String transcode(String text){
try {
return new String(text.getBytes("GBK"),FTP.DEFAULT_CONTROL_ENCODING);
} catch (UnsupportedEncodingException e) {
return null;
}
}
/**
* 方法描述: 连接 ftp服务器 匿名登录无密码
*/
public static void connectServer(String ip, int port) throws IOException {
connectServer(ip,port,"anonymous",null);
}
/**
* 方法描述: 连接 ftp服务器
*/
public static void connectServer(String ip, int port, String user, String password) throws IOException {
// 连接ftp服务器
ftp = new FTPClient();
ftp.connect(ip, port);
// 登录ftp服务器
ftp.login(user, password);
//设置编码
ftp.setControlEncoding("GBK");
//设置文件类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
}
/**
* 关闭连接
*/
public static void closeServer() throws IOException {
if (ftp.isConnected()) {
ftp.logout();
ftp.disconnect();
}
}
/**
* 判断目录是否存在
*/
public static boolean existDirectory(String pathname) throws IOException {
boolean flag = false;
FTPFile[] ftpFileArr = ftp.listFiles(pathname);
for (FTPFile ftpFile : ftpFileArr) {
if (ftpFile.isDirectory() && ftpFile.getName().equalsIgnoreCase(pathname)) {
flag = true;
break;
}
}
return flag;
}
/*
* 获取文件列表
*/
public static List<String> listFiles(String path) throws IOException {
FTPFile[] ftpFiles = ftp.listFiles(path);
List<String> retList = new ArrayList<String>();
for (FTPFile ftpFile : ftpFiles) {
retList.add(ftpFile.getName());
}
return retList;
}
/**
* 上传文件
*/
public static boolean uploadFile(String remote,String local) throws IOException {
InputStream is=new FileInputStream(local);
return ftp.storeFile(transcode(remote),is);
}
/**
* 下载文件
*/
public static boolean downloadFile(String remote,String local) throws IOException {
OutputStream out=new FileOutputStream(local);
return ftp.retrieveFile(transcode(remote),out);
}
/**
* 删除文件
*/
public static boolean deleteFile(String remote) throws IOException {
return ftp.deleteFile(transcode(remote));
}
/**
* 删除文件夹
*/
public static void deleteFolder(String remote) throws IOException {
FTPFile[] ftpFiles=ftp.listFiles(transcode(remote));
for (FTPFile ftpFile : ftpFiles) {
if(ftpFile.isDirectory()){
deleteFolder(remote+"/"+ftpFile.getName());
ftp.removeDirectory(transcode(remote+"/"+ftpFile.getName()));
}else{
deleteFile(ftpFile.getName());
}
}
ftp.removeDirectory(transcode(remote));
}
/**
* 上传文件夹到ftp服务器
*/
public static void uploadFolder(String remote,String local) throws IOException {
File localFile=new File(local);
if(localFile.isDirectory()){
String remoteDir=remote+"/"+localFile.getName();
makeDirectory(remoteDir);
File[] partFiles=localFile.listFiles();
for (File file : partFiles) {
if(file.isDirectory()){
uploadFolder(remoteDir+"/"+file.getName(),local+"/"+file.getName());
}else {
uploadFile(remoteDir+"/"+file.getName(),local+"/"+file.getName());
}
}
}
}
/**
* 下载文件夹到本地
*/
public static void downloadFolder(String remote,String local) throws IOException {
File localFile=new File(local);
if(!localFile.exists()){
localFile.mkdirs();
}
FTPFile[] ftpFiles=ftp.listFiles(transcode(remote));
for (FTPFile ftpFile : ftpFiles) {
if(ftpFile.isDirectory()){
downloadFolder(remote+"/"+ftpFile.getName(),local+"/"+ftpFile.getName());
}else {
downloadFile(remote+"/"+ftpFile.getName(),local+"/"+ftpFile.getName());
}
}
}
/**
* 创建文件夹
*/
public static void makeDirectory(String remote) throws IOException {
if(remote.startsWith("/")){
remote=remote.substring(1);
}
String[] dirNames = remote.split("/");
String tempPath="";
for (String dirName : dirNames) {
tempPath=tempPath+"/"+dirName;
ftp.makeDirectory(transcode(tempPath));
}
}
/**
* 重命名
*/
public static boolean rename(String from, String to) throws IOException {
return ftp.rename(transcode(from),transcode(to));
}
}
使用示例
public static void main(String[] args) throws IOException {
//匿名免密码登录
FTPUtil.connectServer("172.16.10.201",19001,"anonymous",null);
//下载ftp根目录所有文件到本地文件夹
FTPUtil.downloadFolder("/","D://ftp");
//删除文件夹以及文件
FTPUtil.deleteFolder("tarzan");
//创建文件夹
FTPUtil.makeDirectory("tarzan/cms");
//文件夹或文件重命名
FTPUtil.rename("泰山","泰山123");
//上传文件夹
FTPUtil.uploadFolder("software","D:\\Git");
}
来源:https://blog.csdn.net/weixin_40986713/article/details/124386450


猜你喜欢
- 不小心将.idea文件提交后无法删除1、同步git最新代码,将.idea文件同步下来如果同步不下来,看看是不是在同步的时候与本地文件产生了冲
- 本文实例讲述了WinForm中实现picturebox自适应图片大小的方法。分享给大家供大家参考,具体如下:picturebox控件共有两种
- 一.MyBatis简介 一说起对象关系映射框架,大家第一时间想到的肯定是Hibernate。Hibern
- 项目中最近用到各种图表,本来打算用第三方的,例如MPAndroid,这是一个十分强大的图表库,应用起来十分方便,但是最终发现和设计不太一样,
- IoC——Inversion of Control,控制反转在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控
- 上一篇文章里把SwipeRefreshLayout的原理简单过了一下,大致了解了其工作原理,不熟悉的可以去看一下:https://www.j
- this template depends on the android support library,which is either n
- 本文实例讲述了C#使用winform简单导出Excel的方法。分享给大家供大家参考,具体如下:using Excel;在项目中引入Excel
- 写这篇文章,做份备忘,简单滴展示一个带进度条的Webview示例,进度条位于Webview上面.示例图如下:主Activity代码:pack
- 各位亲们可以尝试以下代码:注:这里我就只有一个html标签对来说明问题了,首部之类的东西,自己添加。<html> &n
- 在Controller层时,往往会需要校验或验证某些操作,而在每个Controller写重复代码,工作量比较大,这里在Springboot项
- J2ee 高并 * 况下 * 实例详解引言:在高并发下限制最大并发次数,在web.xml中用过滤器设置参数(最大并发数),并设置其他相关参数。
- /*同步函数当函数中的代码全部放在了同步代码块中,那么这个函数就是同步函数*///同步函数的锁是this锁,this是一个引用,this指向
- 问题使用Runtime调用python脚本一直没有结果,经排查是因为 cv2 的 import 问题java代码:python代码:在导入c
- Java二维数组Java 语言中提供的数组是用来存储固定大小的同类型元素。1.二维数组初始化和声明数组变量的声明,和创建数组可以用一条语句完
- 附加依赖项属性是一个属性本来不属于对象自己,但是某些特定场景其他的对象要使用该对象在这种场景下的值。这个值只在这个场景下使用。基于这个需求设
- 概要应同学邀请,演示如何使用 PyQt5 内嵌浏览器浏览网页,并注入 Javascript 脚本实现自动化操作。下面测试的是一个廉价机票预订
- MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱
- 对于一个应用程序而言,控件是搭建用户界面的积木。它们具备交互式的特征。VS 2012中的控件都放在工具箱中,添加一个控件到窗体,只需在工具箱
- @Resource和@Autowired是Spring Framework中两种常用的注入方式,它们的作用是在Spring容器中自动装配Be