Chinaunix首页 | 论坛 | 博客
  • 博客访问: 807927
  • 博文数量: 780
  • 博客积分: 7000
  • 博客等级: 少将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-12 09:11
文章分类

全部博文(780)

文章存档

2011年(1)

2008年(779)

我的朋友
最近访客

分类:

2008-09-12 09:14:16

    「导读」本文介绍了在JAVA中如何使用java现有的可用的库来编写FTP客户端代码。文章比较了一系列详尽的FTP库,从正反两面介绍了每个库,帮助决策者根据自己的需要选择其中最合适的一个。另外,本文解释了当一个库被替换时,fagade 样式如何帮助改变对其的管理。最后作者Jean-Pierre Norguet讨论并提出了一些由于缺乏权威规范而引起的问题。

    我们设想这样一个情形——我们想写一个纯的从一个远程计算机上运行的FTP上文件的应用程序;我们还希望能够过滤那些供的远程文件的基本文件信息如文件名、数据或者文件大小。

    尽管从头开始写一个FTP处理程序是可能的,并且也许很有趣,但这项工作也是困难、漫长并且存在着潜在的危险。因为我们不愿意亲自花时间、精力、或者金钱去写这样的一个处理程序,所以我们转而采用那些已经存在的可重用的组件。并且很多的库存在于万维网(WWW)上。使用FTP客户端库,一个文件的程序可以用简单地写成这样:

    FTPClient ftpClient = new FTPClient();

    ftpClient.connect("", "user01", "pass1234");

    ftpClient.download("C:", "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所示

    一个RFC1738实现在JDK中是作为标准被提供的,它为FTP传输操作完成合适的工作。它是公开的,并有正式文档说明,而且应该提供源代码。我们写出如下语句来使用这个实现:

    URL url = new  URL(:;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似乎被抛弃了,在我写本文的同时,其网站已经有一个多月没有开了,我也从没收到任何对我的请求支持的回讯。

【责编:Peng】

--------------------next---------------------

阅读(732) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~