JAVA操作FTP(FTP工具类)

JAVA操作FTP(FTP工具类)JAVAFTP操作导入commons-net<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version></dependency>packagecom.my.ftp.test;importjava.io.File;imp

大家好,又见面了,我是你们的朋友全栈君。

Java 操作 FTP、FTP工具类、Java实现FTP代码示例

导入commons-net

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>
package com.my.ftp.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class Ftp { 
   

	private String Control_Encoding = "UTF-8";

	private FTPClient client = null;

	private String host = "";
	private int port = 21;
	private String user = "";
	private String password = "";
	private String ftpPath = "/";

	@SuppressWarnings("unused")
	private Ftp() { 
   
	}

	public Ftp(String host, int port, String user, String pwd) { 
   
		this.host = host;
		this.port = port;
		this.user = user;
		this.password = pwd;
	}

	/** * 获取当前FTP所在目录位置 * * @return */
	public String getHome() { 
   
		return this.ftpPath;
	}

	/** * 连接FTP Server * * @throws IOException */
	public static final String ANONYMOUS_USER = "anonymous";

	public void connect() throws Exception { 
   
		if (client == null) { 
   
			client = new FTPClient();
		}
		// 已经连接
		if (client.isConnected()) { 
   
			return;
		}

		// 编码
		client.setControlEncoding(Control_Encoding);

		try { 
   
			// 连接FTP Server
			client.connect(this.host, this.port);
			// 登陆
			if (this.user == null || "".equals(this.user)) { 
   
				// 使用匿名登陆
				client.login(ANONYMOUS_USER, ANONYMOUS_USER);
			} else { 
   
				client.login(this.user, this.password);
			}
			// 设置文件格式
			client.setFileType(FTPClient.BINARY_FILE_TYPE);
			// 获取FTP Server 应答
			int reply = client.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) { 
   
				client.disconnect();
				throw new Exception("connection FTP fail!");
			}

			FTPClientConfig config = new FTPClientConfig(client.getSystemType().split(" ")[0]);
			config.setServerLanguageCode("zh");
			client.configure(config);
			// 使用被动模式设为默认
			client.enterLocalPassiveMode();
			// 二进制文件支持
			client.setFileType(FTP.BINARY_FILE_TYPE);
			// 设置模式
			client.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);

		} catch (IOException e) { 
   
			throw new Exception("connection FTP fail! " + e);
		}
	}

	/** * 断开FTP连接 * * @param ftpClient * @throws IOException */
	public void close() { 
   
		if (client != null && client.isConnected()) { 
   
			try { 
   
				client.logout();
				client.disconnect();
			} catch (IOException e) { 
   
				e.printStackTrace();
			}
		}
	}

	/** * 获取文件列表 * * @return */
	public List<FTPFile> list() { 
   
		List<FTPFile> list = null;
		try { 
   
			FTPFile ff[] = client.listFiles(ftpPath);
			if (ff != null && ff.length > 0) { 
   
				list = new ArrayList<FTPFile>(ff.length);
				Collections.addAll(list, ff);
			} else { 
   
				list = new ArrayList<FTPFile>(0);
			}
		} catch (IOException e) { 
   
			e.printStackTrace();
		}
		return list;
	}

	/** * 切换目录 * * @param path * 需要切换的目录 * @param forcedIncrease * 如果目录不存在,是否增加 */
	public void switchDirectory(String path, boolean forcedIncrease) { 
   
		try { 
   
			if (path != null && !"".equals(path)) { 
   
				boolean ok = client.changeWorkingDirectory(path);
				if (ok) { 
   
					this.ftpPath = path;
				} else if (forcedIncrease) { 
   
					// ftpPath 不存在,手动创建目录
					StringTokenizer token = new StringTokenizer(path, "\\//");
					while (token.hasMoreTokens()) { 
   
						String npath = token.nextToken();
						client.makeDirectory(npath);
						client.changeWorkingDirectory(npath);
						if (ok) { 
   
							this.ftpPath = path;
						}
					}
				}
			}
		} catch (Exception e) { 
   
			e.printStackTrace();
		}
	}

	/** * 创建目录 * * @param path */
	public void createDirectory(String path) { 
   
		try { 
   
			if (path != null && !"".equals(path)) { 
   
				boolean ok = client.changeWorkingDirectory(path);
				if (!ok) { 
   
					// ftpPath 不存在,手动创建目录
					StringTokenizer token = new StringTokenizer(path, "\\//");
					while (token.hasMoreTokens()) { 
   
						String npath = token.nextToken();
						client.makeDirectory(npath);
						client.changeWorkingDirectory(npath);
					}
				}
			}
			client.changeWorkingDirectory(this.ftpPath);
		} catch (Exception e) { 
   
			e.printStackTrace();
		}
	}

	/** * 删除目录,如果目录中存在文件或者文件夹则删除失败 * * @param path * @return */
	public boolean deleteDirectory(String path) { 
   
		boolean flag = false;
		try { 
   
			flag = client.removeDirectory(path);
		} catch (IOException e) { 
   
			e.printStackTrace();
		}
		return flag;
	}

	/** * 删除文件 * * @param path * @return */
	public boolean deleteFile(String path) { 
   
		boolean flag = false;
		try { 
   
			flag = client.deleteFile(path);
		} catch (IOException e) { 
   
			e.printStackTrace();
		}
		return flag;
	}

	/** * 上传文件,上传文件只会传到当前所在目录 * * @param localFile * 本地文件 * @return */
	public boolean upload(File localFile) { 
   
		return this.upload(localFile, "");
	}

	/** * 上传文件,会覆盖FTP上原有文件 * * @param localFile * 本地文件 * @param reName * 重名 * @return */
	public boolean upload(File localFile, String reName) { 
   
		boolean flag = false;
		String targetName = reName;
		// 设置上传后文件名
		if (reName == null || "".equals(reName)) { 
   
			targetName = localFile.getName();
		}
		FileInputStream fis = null;
		try { 
   
			// 开始上传文件
			fis = new FileInputStream(localFile);
			client.setControlEncoding(Control_Encoding);
			client.setFileType(FTPClient.BINARY_FILE_TYPE);
			boolean ok = client.storeFile(targetName, fis);
			if (ok) { 
   
				flag = true;
			}
		} catch (IOException e) { 
   
			e.printStackTrace();
		}
		return flag;
	}

	/** * 下载文件,如果存在会覆盖原文件 * * @param ftpFileName * 文件名称,FTP上的文件名称 * @param savePath * 保存目录,本地保存目录 * @return */
	public boolean download(String ftpFileName, String savePath) { 
   
		boolean flag = false;

		File dir = new File(savePath);

		if (!dir.exists()) { 
   
			dir.mkdirs();
		}

		FileOutputStream fos = null;
		try { 
   
			String saveFile = dir.getAbsolutePath() + File.separator + ftpFileName;
			fos = new FileOutputStream(new File(saveFile));
			boolean ok = client.retrieveFile(ftpFileName, fos);
			if (ok) { 
   
				flag = true;
			}
		} catch (IOException e) { 
   
			e.printStackTrace();
		}
		return flag;
	}

	public static void main(String args[]) { 
   

		// 创建FTP对象
		Ftp ftp = new Ftp("127.0.0.1", 21, "myftp", "myftp@2020");
		try { 
   
			// 连接FTP
			ftp.connect();

			// 移动工作空间、切换目录
			System.out.println("当前位置:" + ftp.getHome());
			ftp.switchDirectory("/test", true);
			System.out.println("当前位置:" + ftp.getHome());

			// 查询目录下的所有文件夹以及文件
			List<FTPFile> list = ftp.list();
			System.out.println("|-- " + ftp.getHome());
			for (FTPFile f : list) { 
   
				System.out.println(" |-- [" + (f.getType() == 0 ? "文件" : "文件夹") + "]" + f.getName());
			}

			// 上传文件
			boolean r1 = ftp.upload(new File("C:\\Users\\joymt\\Documents\\ftp\\测试文件1.txt"), "测试文件2.txt");
			System.out.println("上传文件:" + r1);

			// 下载文件
			boolean r2 = ftp.download("测试文件2.txt", "C:\\Users\\joymt\\Documents\\ftp");
			System.out.println("下载文件:" + r2);

			// 删除文件
			boolean r3 = ftp.deleteFile("/test/测试文件2.txt");
			System.out.println("删除文件:" + r3);

			// 删除目录
			boolean r4 = ftp.deleteDirectory("/test");
			System.out.println("删除目录:" + r4);

		} catch (Exception e) { 
   
			e.printStackTrace();
		}

		ftp.close();
	}

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133224.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 大话无线通讯基础之:WIFI和5G信道划分

    大话无线通讯基础之:WIFI和5G信道划分目前主流的无线WIFI网络设备802.11a/b/g/n/ac:各种协议的数据传输率:80211.a协议支持的数据传输率:6、9、12、18、24、36、48和54Mbps80211.b协议支持的数据传输率:1、2、5.5和11Mbps80211.g协议支持的数据传输率:6、9、12、18、24、36、48和54Mbps;可以降级到1、2、5.5…

  • 基于内容的图像检索技(CBIR)术相术介绍

    基于内容的图像检索技(CBIR)术相术介绍本文主要简单的介绍了基于内容的图像检索(CBIR:Content-BasedImageRetrieval)的相关技术,其是指根据图像对象的内容及上下文信息在大规模多媒体数据中检索所需信息。基于内容的图像检索技术通过近几十年的发展已经取得了丰硕的成果,文中对对图像检索的相关内容进行简单的分析,并对与图像检索相关的资料进行了简单的整理和收集。

  • A*算法之八数码问题 python解法

    A*算法之八数码问题python解法文章目录A*算法之八数码问题python解法问题描述A*算法与八数码问题状态空间的定义各种操作的定义启发式函数的定义人工智能课程中学习了A*算法,在耗费几小时完成了八数码问题和野人传教士问题之后,决定写此文章来记录一下,避免忘记问题描述在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为12380

  • Node入门教程(11)第九章:Node 的网络模块

    Node入门教程(11)第九章:Node 的网络模块

  • SNAP7 C++ 通讯

    SNAP7 C++ 通讯 静态调用的dll的一个实例2017年11月17日09:49:18 净无邪 阅读数:334版权声明:本文为博主原创文章,欢迎各位朋友转载。转载时,保留链接地址!https://blog.csdn.net/naibozhuan3744/article/details/78557761本实例主要分为三部分。第一部分:vs2013的配置,第二部分:snap7的dll常用函数何功能的介…

  • 国内做得好的hr系统_平安hrx下载

    国内做得好的hr系统_平安hrx下载HR专家训练营-X版本成为HR专家系列(X版本)链接:https://pan.baidu.com/s/1–jD9mySf2dIcGKEG-4LYw提取码:8boq备用链接天翼云盘下载不限速,建议使用天翼云下载速度会更快一些https://cloud.189.cn/t/ua2MfmQN7Bnq(访问码:6p4z){1}–课程简介{10}–干部管理{11}–企业文化{1…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号