「导读」本文介绍了在JAVA中如何使用java现有的可用的库来编写FTP客户端代码文章比较了一系列详尽的FTP库从正反两面介绍了每个库帮助决策者根据自己的需要选择其中最合适的一个另外本文解释了当一个库被替换时fagade 样式如何帮助改变对其的管理最后作者JeanPierre Norguet讨论并提出了一些由于缺乏权威规范而引起的问题
我们设想这样一个情形——我们想写一个纯Java的从一个远程计算机上运行的FTP服务器上下载文件的应用程序我们还希望能够过滤那些供下载的远程文件的基本文件信息如文件名数据或者文件大小
尽管从头开始写一个FTP协议处理程序是可能的并且也许很有趣但这项工作也是困难漫长并且存在着潜在的危险因为我们不愿意亲自花时间精力或者金钱去写这样的一个处理程序所以我们转而采用那些已经存在的可重用的组件并且很多的库存在于万维网(WWW)上使用FTP客户端库一个下载文件的程序可以用Java简单地写成这样
FTPClient ftpClient = new FTPClient()
nnect( user pass)
ftpClientdownload(C\\Temp\\ READMEtxt)
// Eventually other operations here ……
ftpClientdisconnect()
找一个优秀的适合我们需要的java FTP 客户端库并不像看起来那么简单相反这是一项非常痛苦复杂的工作首先找到一个FTP客户端库需要一些时间其次在我们找到所有的存在的库后我们该选哪一个呢?每个库都适合不同的需求这些库在性能上是不等价的并且它们的设计上有着根本上的差别每个类库都各具特点并使用不同的术语来描述它们因而评价和比较FTP客户端库是一件困难的事情
使用可重用组件是一种值得提倡的方法但是在这种情况下刚开始往往是令人气馁的后来或许有点惭愧在选择了一个好的FTP库后其后的工作就非常简单了按简单的规则来就行了
本文的目的是使选择的过程更简短容易有价值首先我列举了所有的可用的FTP客户端库然后定义并描述了一系列的FTP客户端库应该在某方面提出的相关标准最后我会描述一下这些库的性能等彼此比较的结果所有的这些都为我们做一个快速的可靠的长期的决定提供了所需的东西
FTP 的JDK支持
注释(RFC)需要FTP的参考规范SUN微系统在JDK中提供了一个RFC接口但是它是内在的没有正式文档记载的并且没有提高任何源代码尽管RFC目前还没有清楚的说明它实际上是RFC的一个公共接口的实现的后续——URL规范如图所示
一个RFC实现在JDK中是作为标准被提供的它为FTP传输操作完成合适的工作它是公开的并有正式文档说明而且应该提供源代码我们写出如下语句来使用这个实现
URL url = new URL(ftp://user/READMEtxttype=i)
URLConnection urlc = urlopenConnection()
InputStream is = urlcgetInputStream() // 下载
OutputStream os = urlcgetOutputStream() // 上传
FTP客户端的JDK支持严格的遵循标准建议但是它具有一些缺点
首先它和第三方FTP类库有着根本的区别RFC实现优于RFC的
第二大多数台式机的FTP客户端工具中都是基于RFC实现的很多的JAVA程序使用这些工具来连接到FTP服务器由于喜好的原因这些工具大部分需要采用基于RFC的库
第三URL和URLConnection类只是为通讯打开流SUN的库没有为将原始的FTP服务器的回应信息组织构成更多可用的Java的对象如String File RemoteFile 或 Calendar这些提供任何直接的支持因此我们必须写更多的代码来将数据写入文件或者生成一个目录表
第四正如RFC中的节所说明的最优化FTP URLs要求在每次操作后都要将连接控制关闭当传输很多小的文件的时候这是相当不经济的而且效率相当低而且强限制的FTP服务器可能判断这是一个恶意的网络攻击或滥用高层通讯进而会禁止其进一步的访问
最后它缺乏一些有用的特征
由于上述的原因使用一个第三者库是更优越的下面的就列举出了一些可用的第三者代替方案
库的比较
下面的列表简单的概述了我在本文中比较的库它们都遵循FTP参考规范下面我将列举提供者名字和库的名称(斜体字表示的部分)资源中包含了到每个产品的站点的链接为了启动对库的使用我还在本文中论及了主要的FTP客户端类
JScape iNet Factory comjscapeinetftpFtp
/n software IP*Works ipworksFtp
Enterprise Distributed Technologies Java FTP Client Library
ftpFTPClient
IBM alphaWorks FTP Bean Suite
workftpprotocolFTPProtocol
SourceForge JFtp FtpConnection
The Jakarta Project Jakarta Commons/Net
ftpFTPClient
JavaShop JNetBeans jshopjnetFTPClient
Sun JDK ftpFtpClient
Florent Cueto JavaFTP API comcqsftpFTP
Bea Petrovicova jFTP czdhlftpFtp
The Globus Project Java CoG Kit orgglobusioftpFTPClient
注
在我写本文的同时IBM正在评估将它的alphaWorks FTP Bean Suite 发布到网上是否合适但是目前已经取消了所有的用户下载权限
Jakarta Commons/Net 是Savarese NetComponents(不再发展)的一个临时性替代
JavaShop JNetBeans似乎被抛弃了在我写本文的同时其网站已经有一个多月没有开了我也从没收到任何对我的请求支持的回讯