edtftp实现FTP开发
作者:mobiledu2502870743 | 来源:互联网 | 2023-05-17 11:47
用edtftpj实现JavaFTP客户端工具edtftpj是一个javaFTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活。edtftpj有多种版本,分别是java、.n
用edtftpj实现Java FTP客户端工具
edtftpj是一个java FTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活。edtftpj有多种版本,分别是java、.net和js版本。对于Java版的有一个免费版本。我用的就是免费版本。其余的均为商业版本。
为了开发,先下载免费版本的开发包。
主 页:[url]http://www.enterprisedt.com/[/url]
工具包:[url]http://www.enterprisedt.com/products/edtftpj/download/edtftpj.zip[/url]
目前我用的是2.03。
在开发FTP客户端工具之前,先看看其E文的开发指南:
一、开发指南
1、在开发中,最核心的API在两个类中,分别是:
FileTransferClient 通过构建此对象来是进行FTP文件传输. 支持 "plain" FTP, i.e. RFC 959 FTP
FTPClient 功能和FileTransferClient一样,已经被废弃. 支持 "plain" FTP, i.e. RFC 959 FTP
2、连接一个FTP服务器
1)、构建FileTransferClient对象
FileTransferClient ftp = new FileTransferClient();
2)、设置远程主机和用户认证
ftp.setRemoteHost(host);
ftp.setUserName(username);
ftp.setPassword(password);
ftp.setRemotePort(21);
ftp.setTimeout(1200);
3)、登录到服务器
ftp.connect();
4)、关闭连接
ftp.disconnect();
3、设置更多的连接属性
1)、设置自动登录
ftp.getAdvancedFTPSettings().setAutoLogin(false);
2)、设置传输缓冲区
ftp.getAdvancedSettings().setTransferBufferSize(1024)
3)、设置获取服务器端信息时所使用的编码
ftp.getAdvancedSettings().setControlEncoding("GBK");
4)、设置传输通知的时间间隔
ftp.getAdvancedSettings().setTransferNotifyInterval(5000);
5)、其他的一些设置
ftp.getAdvancedFTPSettings().setConnectMode(FTPConnectMode.ACTIVE);
ftp.getAdvancedFTPSettings().setActivePortRange(61500, 61510);
ftp.getAdvancedFTPSettings().setConnectMode(FTPConnectMode.PASV);
4、改变当前的工作目录
1)、获取当前的ftp工作目录
string directory = ftp.getRemoteDirectory();
2)、改变当前的工作目录
ftp.changeDirectory(directory);
3)、改变当前的工作目录为其父目录
ftp.changeToParentDirectory();
5、上传与下载、暂停
1)、上传
ftp.uploadFile(java.lang.String localFileName, java.lang.String remoteFileName)
2)、下载
ftp.downloadFile(java.lang.String localFileName, java.lang.String remoteFileName)
3)、暂停所有的传输
ftp.cancelAllTransfers()
当然,以上很多方法都有多中重载格式。下面给出一个简单封装的JavaFTP客户端工具:
二、封装的客户端工具
import com.enterprisedt.net.ftp.FTPException;
import com.enterprisedt.net.ftp.FTPFile;
import com.enterprisedt.net.ftp.FileTransferClient;
import com.enterprisedt.net.ftp.WriteMode;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
/**
* edtftpj-2.0.3 工具简单封装测试
*
* @author leizhimin 2008-9-19 13:33:03
*/
public class FtpUtil {
private static Log log = LogFactory.getLog(FtpUtil.class);
private FileTransferClient client = null;
public static void main(String[] args) throws FTPException, IOException {
FtpUtil ftp = new FtpUtil();
// ftp.connectServer();
File file = new File("C:\\ooo\\upx");
UploadListener listener = new UploadListener(ftp.client);
ftp.ftpUploadFolder(file, listener);
ftp.ftpDownload("c:\\new1111.gif", "/upx/down.gif");
ftp.disconnect();
}
public FtpUtil() {
this.connectServer();
}
public FileTransferClient getClient() {
return client;
}
/**
* 连接ftp服务器
*
* @return 连接成功标识
*/
public boolean connectServer() {
boolean flag = false;
client = new FileTransferClient();
try {
client.setUserName("admin");
client.setPassword("123");
client.setRemoteHost("localhost");
client.setRemotePort(21);
client.setTimeout(1200);
client.setEventListener(new UploadListener(client));
client.getAdvancedSettings().setTransferBufferSize(1000);
client.getAdvancedSettings().setTransferNotifyInterval(5000);
client.getAdvancedSettings().setControlEncoding("GBK");
client.connect();
flag = true;
} catch (FTPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
/**
* 关闭FTP客户端连接
*
* @return 关闭成功标识
*/
public boolean disconnect() {
boolean flag = false;
try {
client.disconnect();
flag = true;
} catch (FTPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
/**
* 上传文件
*
* @param file 文件
* @param ul 监听器
*/
public void ftpUploadFile(File file, UploadListener ul) {
String fileName = file.getName();
String filePath = file.getPath();
try {
client.uploadFile(filePath, fileName, WriteMode.RESUME);
int len = (int) client.getSize(fileName);
log.info("上传文件" + filePath + "完成,大小为" + len + "字节!");
} catch (FTPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 上传文件(夹)
*
* @param file 上传文件
* @param ul 上传监听器
*/
public void ftpUploadFolder(File file, UploadListener ul) {
if (file.isFile()) {
ftpUploadFile(file, ul);
}
try {
if (file.isDirectory()) {
FTPFile[] ftpFiles = client.directoryList();
boolean isExist = false;
//遍历FTP当前目录的文件文件名,如果存在则停止查找,如果不存在则设计标记为不存在
for (FTPFile ftpFile : ftpFiles) {
if (ftpFile.getName().equals(file.getName())) {
isExist = true;
break;
}
}
//如果要上传的目录不存在,则创建上传目录
if (!isExist) {
client.createDirectory(file.getName());
}
//设置当前目录
client.changeDirectory(file.getName());
//上传文件的列表
File[] upFiles = file.listFiles();
for (File upFile : upFiles) {
if (upFile.isFile()) {
ftpUploadFile(upFile, ul);
} else if (upFile.isDirectory()) {
ftpUploadFolder(upFile, ul);
}
}
client.changeToParentDirectory();
}
} catch (FTPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
/**
* 下载文件
*
* @param localFileName 本地文件名
* @param remoteFileName 远程文件名
* @throws FTPException
* @throws IOException
*/
public void ftpDownload(String localFileName, String remoteFileName) throws FTPException, IOException {
client.downloadFile(localFileName, remoteFileName, WriteMode.OVERWRITE);
}
}
import com.enterprisedt.net.ftp.EventAdapter;
import com.enterprisedt.net.ftp.FileTransferClient;
/**
* 上传过程监听类
*
* @author leizhimin 2008-9-22 16:05:53
*/
class UploadListener extends EventAdapter {
private long bytesTransferred = 0;
private FileTransferClient ftpClient;
public UploadListener(FileTransferClient ftpClient) {
this.ftpClient = ftpClient;
}
public void bytesTransferred(String connId, String remoteFilename, long bytes) {
bytesTransferred = bytes;
}
}
运行结果:
2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile
信息: 上传文件C:\ooo\upx\1\12\12.txt完成,大小为0字节!
2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile
信息: 上传文件C:\ooo\upx\1\11\11.txt完成,大小为0字节!
2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile
信息: 上传文件C:\ooo\upx\1\1.txt完成,大小为0字节!
2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile
信息: 上传文件C:\ooo\upx\1\新建 FDF Document.fdf完成,大小为0字节!
2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile
信息: 上传文件C:\ooo\upx\1\新建 WinRAR 压缩文件.rar完成,大小为20字节!
2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile
信息: 上传文件C:\ooo\upx\aa.fdf完成,大小为0字节!
Process finished with exit code 0
推荐阅读
-
个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ...
[详细]
蜡笔小新 2023-12-13 14:20:23
-
本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ...
[详细]
蜡笔小新 2023-12-14 19:53:34
-
-
本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ...
[详细]
蜡笔小新 2023-12-14 18:02:45
-
本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ...
[详细]
蜡笔小新 2023-12-14 03:24:19
-
本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ...
[详细]
蜡笔小新 2023-12-12 16:19:02
-
IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ...
[详细]
蜡笔小新 2023-12-12 13:43:58
-
本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ...
[详细]
蜡笔小新 2023-12-11 13:08:10
-
本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ...
[详细]
蜡笔小新 2023-12-10 22:17:08
-
Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ...
[详细]
蜡笔小新 2023-12-14 17:38:12
-
本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ...
[详细]
蜡笔小新 2023-12-14 10:01:13
-
关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ...
[详细]
蜡笔小新 2023-12-13 15:47:22
-
本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ...
[详细]
蜡笔小新 2023-12-10 14:33:46
-
本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ...
[详细]
蜡笔小新 2023-12-09 20:16:01
-
本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ...
[详细]
蜡笔小新 2023-12-09 19:26:56
-
本文介绍了Foundation框架中一些常用的结构体和类,包括表示范围作用的NSRange结构体的创建方式,处理几何图形的数据类型NSPoint和NSSize,以及由点和大小复合而成的矩形数据类型NSRect。同时还介绍了创建这些数据类型的方法,以及字符串类NSString的使用方法。 ...
[详细]
蜡笔小新 2023-12-09 17:56:07
-
mobiledu2502870743
这个家伙很懒,什么也没留下!