摘要:
本文介绍了在JAVA中如何使用java现有的可用的库来编写FTP客户端代码。文章比较了一系列详尽的FTP库,从正反两面介绍了每个库,帮助决策者根据自己的需要选择其中最合适的一个。另外,本文解释了当一个库被替换时,fagade 样式如何帮助改变对其的管理。最后作者Jean-Pierre Norguet讨论并提出了一些由于缺乏权威规范而引起的问题。(2003/4/4)
让我们设想这样一个情形--我们想写一个纯Java的从一个远程计算机上运行的FTP服务器上下载文件的应用程序;我们还希望能够过滤那些供下载的远程文件的基本文件信息如文件名、数据或者文件大小。
尽管从头开始写一个FTP协议处理程序是可能的,并且也许很有趣,但这项工作也是困难、漫长并且存在着潜在的危险。因为我们不愿意亲自花时间、精力、或者金钱去写这样的一个处理程序,所以我们转而采用那些已经存在的可重用的组件。并且很多的库存在于万维网(WWW)上。使用FTP客户端库,
一个下载文件的程序可以用Java简单地写成这样:
FTPClient ftpClient = new FTPClient();
ftpClient.connect("ftp.foo.com", "user01", "pass1234");
ftpClient.download("C:\Temp\", "README.txt");
// Eventually other operations here ...
ftpClient.disconnect();
找一个优秀的适合我们需要的java FTP 客户端库并不像看起来那么简单。相反这是一项非常痛苦复杂的工作。首先找到一个FTP客户端库需要一些时间,其次,在我们找到所有的存在的库后,我们该选哪一个呢?每个库都适合不同的需求。这些库在性能上是不等价的,并且它们的设计上有着根本上的差别。每个类库都各具特点并使用不同的术语来描述它们。因而,评价和比较FTP客户端库是一件困难的事情。
使用可重用组件是一种值得提倡的方法,但是在这种情况下,刚开始往往是令人气馁的。后来或许有点惭愧:在选择了一个好的FTP库后,其后的工作就非常简单了,按简单的规则来就行了。
本文的目的是使选择的过程更简短、容易、有价值。首先我列举了所有的可用的FTP客户端库,然后定义并描述了一系列的FTP客户端库应该在某方面提出的相关标准。最后,我会描述一下这些库的性能等彼此比较的结果。所有的这些都为我们做一个快速的,可靠的,长期的决定提供了所需的东西。
FTP 的JDK支持
注释959(RFC959)需要FTP的参考规范,SUN微系统在JDK中提供了一个RFC959接口,但是它是内在的、没有正式文档记载的、并且没有提高任何源代码。尽管RFC959目前还没有清楚的说明,它实际上是RFC1738的一个公共接口的实现的后续--URL规范,如图1所示
IMG http://www.javaworld.com/javaworld/jw-04-2003/images/jw-0404-ftp1-thumb.gif[/IMG]
一个RFC1738实现在JDK中是作为标准被提供的,它为FTP传输操作完成合适的工作。它是公开的,并有正式文档说明,而且应该提供源代码。我们写出如下语句来使用这个实现:
URL url = new URL("ftp://user01:pass1234@ftp.foo.com/README.txt;type=i");
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream(); // 下载
OutputStream os = urlc.getOutputStream(); // 上传
FTP客户端的JDK支持严格的遵循标准建议,但是它具有一些缺点:
首先,它和第三方FTP类库有着根本的区别,RFC959实现优于RFC1738的;
第二,大多数台式机的FTP客户端工具中都是基于RFC959实现的,很多的JAVA程序使用这些工具来连接到FTP服务器。由于喜好的原因,这些工具大部分需要采用基于RFC959的库。
第三,URL和URLConnection类只是为通讯打开流。SUN的库没有为将原始的FTP服务器的回应信息组织构成更多可用的Java的对象如String, File, RemoteFile, 或 Calendar这些提供任何直接的支持。因此我们必须写更多的代码来将数据写入文件或者生成一个目录表。
第四,正如RFC1738中的3.2.5节所说明的,“最优化,FTP URLs要求在每次操作后都要将连接控制关闭。当传输很多小的文件的时候,这是相当不经济的,而且效率相当低。而且,强限制的FTP服务器可能判断这是一个恶意的网络攻击或滥用高层通讯,进而会禁止其进一步的访问。
最后,它缺乏一些有用的特征。
由于上述的原因,使用一个第三者库是更优越的。下面的就列举出了一些可用的第三者代替方案:
库的比较:
下面的列表简单的概述了我在本文中比较的库。它们都遵循FTP参考规范,下面我将列举提供者名字和库的名称(斜体字表示的部分),资源中包含了到每个产品的站点的链接。为了启动对库的使用,我还在本文中论及了主要的FTP客户端类。
1. JScape, iNet Factory: com.jscape.inet.ftp.Ftp
2. /n software, IP*Works: ipworks.Ftp
3. Enterprise Distributed Technologies, Java FTP Client Library:
com.enterprisedt.net.ftp.FTPClient
4. IBM alphaWorks, FTP Bean Suite:
com.ibm.network.ftp.protocol.FTPProtocol
5. SourceForge, JFtp: net.sf.jftp.net.FtpConnection
6. The Jakarta Project, Jakarta Commons/Net:
org.apache.commons.net.ftp.FTPClient
7. JavaShop JNetBeans: jshop.jnet.FTPClient
8. Sun, JDK: sun.net.ftp.FtpClient
9. Florent Cueto, JavaFTP API: com.cqs.ftp.FTP
10.Bea Petrovicova, jFTP: cz.dhl.ftp.Ftp
11.The Globus Project, Java CoG Kit: org.globus.io.ftp.FTPClient
注:
1.在我写本文的同时,IBM正在评估将它的alphaWorks FTP Bean Suite 发布到网上是否合适。但是目前已经取消了所有的用户下载权限。
2.Jakarta Commons/Net 是Savarese NetComponents(不再发展)的一个临时性替代。
3.JavaShop JNetBeans似乎被抛弃了,在我写本文的同时,其网站已经有一个多月没有开了,我也从没收到任何对我的请求支持的回讯。
Matrix经javaworld授权翻译
您可以点击-watermark查看翻译作者的详细信息.
加入matrix,与java共舞: www.matrix.org.cn Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
标签: