「導讀」本文介紹了在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似乎被拋棄了在我寫本文的同時其網站已經有一個多月沒有開了我也從沒收到任何對我的請求支持的回訊
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27085.html