要求
要運(yùn)行ftp4j library,你需要Java 運(yùn)行時環(huán)境v. 1.4+.
安裝
將ftp4j JAR文件添加到你應(yīng)用程序的classpath中, 然后你就可以自動啟用ftp4j類的使用了.
Javadocs
可參考ftp4j javadocs.
快速入門
包中的主類是FTPClient (it.sauronsoftware.ftp4j.FTPClient).
創(chuàng)建一個FTPClient 實例:
FTPClient client = new FTPClient();
連接遠(yuǎn)程FTP服務(wù):
client.connect("ftp.host.com");
如果服務(wù)端口不是標(biāo)準(zhǔn)的21端口 (或 FTPS的990端口),需要使用port參數(shù)進(jìn)行指定:
client.connect("ftp.host.com", port);
如:
client.connect("ftp.host.com", 8021);
然后進(jìn)行登錄流程:
client.login("carlo", "mypassword");
如果沒有拋出任何異常的話,那么你就通過遠(yuǎn)程服務(wù)器的認(rèn)證了.否則,如果驗證失敗,你將會收到it.sauronsoftware.ftp4j.FTPException異常.
匿名認(rèn)證,如果被連接服務(wù)認(rèn)可的話, 可通過發(fā)送用戶名"anonymous" 和任意密碼來完成(注意,有些服務(wù)器需要e-mail地址來代替密碼):
client.login("anonymous", "ftp4j");
使用遠(yuǎn)程FTP服務(wù)來做任何事情,然后再斷開連接:
client.disconnect(true);
這會向遠(yuǎn)程器發(fā)送FTP QUIT命令, 以進(jìn)行一個合法斷開流程.如果你只是想中斷連接而不想向服務(wù)器發(fā)送任何通知,那么可以使用:
client.disconnect(false);
使用代理進(jìn)行連接
客戶端通過連接器(一個繼承自it.sauronsoftware.ftp4j.FTPConnector的對象)來連接服務(wù)器, 它將返回一個已經(jīng)打開的連接(一個實現(xiàn)了it.sauronsoftware.ftp4j.FTPConnection 接口的對象).這也是為什么ftp4j 可以支持大量代理的原因.
在連接遠(yuǎn)程服務(wù)器前,客戶端實例可以使用setConnector() 方法來設(shè)置連接器:
client.setConnector(anyConnectorYouWant);
如果沒有設(shè)置連接器的話,會使用默認(rèn)的連接器DirectConnector (it.sauronsoftware.ftp4j.connectors.DirectConnector), 它實現(xiàn)了對遠(yuǎn)程服務(wù)器的直接連接,且不會使用代理。
如果你只能通過代理來連接遠(yuǎn)程服務(wù)器, ftp4j包可以讓你在下面的連接器中進(jìn)行選擇:
- HTTPTunnelConnector (it.sauronsoftware.ftp4j.connectors.HTTPTunnelConnector)
它可以通過HTTP代理來進(jìn)行連接,并支持CONNECT方法. - FTPProxyConnector (it.sauronsoftware.ftp4j.connectors.FTPProxyConnector)
它可以通過FTP代理進(jìn)行連接,支持SITE和OPEN命令風(fēng)格的苛刻遠(yuǎn)程主機(jī)連接.其它類型的FTP代理,需要username@remotehost 認(rèn)證,且可以不使用連接器,因為它們對于客戶端來說是透明的。 - SOCKS4Connector (it.sauronsoftware.ftp4j.connectors.SOCKS4Connector)
它可以通過SOCKS 4/4a代理進(jìn)行連接. - SOCKS5Connector (it.sauronsoftware.ftp4j.connectors.SOCKS5Connector)
它可以通過SOCKS 5代理進(jìn)行連接.
因為ftp4j的連接器架構(gòu)設(shè)計為可插拔的,因此你可以繼承FTPConnector 抽象類來構(gòu)建自己的連接器.
FTPS/FTPES 安全連接
ftp4j包支持FTPS (隱式基于 TLS/SSL的FTP) 和FTPES (顯示基于TLS/SSL的FTP).
setSecurity() 方法可用來打開這種特性:
client.setSecurity(FTPClient.SECURITY_FTPS); // 啟用 FTPS
client.setSecurity(FTPClient.SECURITY_FTPES); // 啟用 FTPES
兩個方法都需要在連接遠(yuǎn)程服務(wù)器前調(diào)用.
如果安全協(xié)議設(shè)置成了SECURITY_FTPS, 則connect() 方法默認(rèn)使用的端口為990.
默認(rèn)情況下,客戶端對象商討SSL連接會使用javax.net.ssl.SSLSocketFactory.getDefault()作為其套接字工廠.可通過調(diào)用client.setSSLSocketFactory()方法來改變默認(rèn)套接字工廠. 另外一種SSLSocketFactory, 可用來信任遠(yuǎn)程服務(wù)器頒發(fā)的證書(謹(jǐn)慎使用):
import it.sauronsoftware.ftp4j.FTPClient;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
// ... TrustManager[] trustManager = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) { }
public void checkServerTrusted(X509Certificate[] certs, String authType) { } } };
SSLContext sslContext = null;
try { sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManager, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
FTPClient client = new FTPClient();
client.setSSLSocketFactory(sslSocketFactory);
client.setSecurity(FTPClient.SECURITY_FTPS);
// or client.setSecurity(FTPClient.SECURITY_FTPES); // ...
瀏覽遠(yuǎn)程站點
獲取當(dāng)前目錄的的絕對路徑(此目錄是FTP服務(wù)器的home目錄):
String dir = client.currentDirectory();
改變目錄:
client.changeDirectory(newPath);
你可以使用絕對路徑和相對路徑:
client.changeDirectory("/an/absolute/one");
client.changeDirectory("relative");
回到父目錄:
client.changeDirectoryUp();
重命名文件和目錄
要重命名遠(yuǎn)程文件或目錄:
client.rename("oldname", "newname");
移動文件和文件家
rename() 方法也可以用來從當(dāng)前位置移動文件或目錄到其它位置.
在這個例子子,假設(shè)在當(dāng)前工作目錄中,你有一個名為"myfile.txt"的文件,然后你想將其移動到子目錄"myfolder"中:
client.rename("myfile.txt", "myfolder/myfile.txt");
刪除文件
要刪除遠(yuǎn)程文件,需要調(diào)用:
client.deleteFile(relativeOrAbsolutePath);
在這個例子中:
client.deleteFile("useless.txt");
創(chuàng)建、刪除目錄
如果遠(yuǎn)程服務(wù)給你機(jī)會的話,你可以在遠(yuǎn)程站點上創(chuàng)建新目錄:
client.createDirectory("newfolder");
你也可以已存在的目錄:
client.deleteDirectory(absoluteOrRelativePath);
在這個例子中:
client.deleteDirectory("oldfolder");
請注意,通常情況下,F(xiàn)TP 服務(wù)器只允許刪除空目錄.
列出文件、目錄、連接
FTP 協(xié)議并不會提供大量支持方法來獲取工作目錄的完整信息.通常LIST命令會給你想知道的東西,但不辛的是,每個服務(wù)器會使用不同樣式的響應(yīng). 這意味著某些服務(wù)器會返回UNIX樣式的目錄,有些服務(wù)器會返回DOS樣式的目錄,其它的服務(wù)器又會使用別的樣式.
ftp4j 包可以處理許多的LIST響應(yīng)格式, 并將它們構(gòu)建成統(tǒng)一目錄內(nèi)容的結(jié)構(gòu)對象表示.當(dāng)前ftp4j可以處理:
- UNIX 樣式及其變種(如MAC樣式)
- DOS 樣式
- NetWare 樣式
- EPLF
- MLSD
這可以通過使用可插拔的parsers來完成.包it.sauronsoftware.ftp4j.listparsers包含了用于處理上述樣式的對象.大多數(shù)時間,這些已經(jīng)夠用了。
要列出當(dāng)前工作目錄下的文件或文件夾,可調(diào)用:
FTPFile[] list = client.list();
如果你收到了FTPListParseException (it.sauronsoftware.ftp4j.FTPListParseException) 異常,這就意味著服務(wù)器對LIST命令返回了不可理解的樣式,即它不是上述列出的樣式.因此,你可以嘗試使用listNames() 方法, 但它并不如list()方法有優(yōu)勢.。為了彌補(bǔ)這種缺陷,你可以構(gòu)建你自己的LIST響應(yīng)解析器,以支持你遇到的樣式.你可以實現(xiàn)FTPListParser (it.sauronsoftware.ftp4j.FTPListParser) 接口,然后你可以在client的addListParser()方法使用此實現(xiàn).
FTPFile (it.sauronsoftware.ftp4j.FTPFile) 對象提供了目錄內(nèi)容的表示,包括文件,子目錄和連接. 根據(jù)服務(wù)器的響應(yīng),F(xiàn)TPFile對象的某些字段可以是null 的或者是無意義的.請檢查javadocs來了解細(xì)節(jié).
在list() 方法中你也可以使用文件過濾參數(shù),如:
FTPFile[] list = client.list("*.jpg");
如果連接服務(wù)器明確支持MLSD命令, ftp4j會用其來代替基本的LIST命令。MLSD的響應(yīng)事實更為標(biāo)準(zhǔn),準(zhǔn)確,更易解析.不幸的是,不是所有服務(wù)器都支持這個命令,并且有些服務(wù)器支持得非常糟糕.基于這些理由,開發(fā)者可以控制ftp4j是否應(yīng)該使用MLSD命令,即通過調(diào)用FTPClient對象的setMLSDPolicy()方法. 合法的值:
FTPClient.MLSD_IF_SUPPORTED
client只在服務(wù)器明確支持MLSD命令時,才使用MLSD命令. 這是ftp4j默認(rèn)的行為.
FTPClient.MLSD_ALWAYS
client總是會使用MLSD命令, 即便服務(wù)器沒有明確表明支持MLSD命令.
FTPClient.MLSD_NEVER
client絕不使用MLSD命令,即便服務(wù)器明確表明支持MLSD命令.
例如:
client.setMLSDPolicy(FTPClient.MLSD_NEVER);
獲取文件、目錄的最后修改時間
通常情況下FTPFile對象會告訴你條目的最后修改時間, 但正如上面描述的,這依賴于服務(wù)器發(fā)回的響應(yīng).如果你需要最后的修改時間,但你又不能通過list()方法得到,那么可以嘗試這樣做:
java.util.Date md = client.modifiedDate("filename.ext");
下載、上傳文件
下載遠(yuǎn)程文件最簡單的方式是調(diào)用download(String, File) 方法:
client.download("remoteFile.ext", new java.io.File("localFile.ext"));
要上傳:
client.upload(new java.io.File("localFile.ext"));
要在已有文件中上傳追加內(nèi)容:
client.append(new java.io.File("localFile.ext"));
這些是阻塞式調(diào)用:它們會在傳輸完成后(或failed, 或 aborted時)才返回. 此外同步鎖是否由客戶端來實施的,因為在每個時間段內(nèi)只允許有一個常規(guī)的FTP通信.在每個時間段內(nèi),你可以處理多個傳輸器,即使用多個FTPClient 對象,每個都與服務(wù)器建立一個私有連接.
你可以使用FTPDataTransferListener (it.sauronsoftware.ftp4j.FTPDataTransferListener)對象來監(jiān)控傳輸.你可以自己實現(xiàn)一個:
import it.sauronsoftware.ftp4j.FTPDataTransferListener;
public class MyTransferListener implements FTPDataTransferListener {
public void started() {
// Transfer started
}
public void transferred(int length) {
// Yet other length bytes has been transferred since the last time this
// method was called
}
public void completed() {
// Transfer completed
}
public void aborted() {
// Transfer aborted
}
public void failed() {
// Transfer failed
}
}
現(xiàn)在像下面這樣來下載或上傳:
client.download("remoteFile.ext", new java.io.File("localFile.ext"), new MyTransferListener());
client.upload(new java.io.File("localFile.ext"), new MyTransferListener());
client.append(new java.io.File("localFile.ext"), new MyTransferListener());
當(dāng)client處理下載或上傳時,傳輸器可以被同一個FTPClient對象的不同線程通過調(diào)用 abortCurrentDataTransfer() 方法aborted. 此方法還需要一個boolean參數(shù):true表示執(zhí)行合法的abort過程(即向服務(wù)器發(fā)送ABOR命令), false表示實然關(guān)閉傳輸器,而不向服務(wù)器發(fā)送通知:
client.abortCurrentDataTransfer(true); // Sends ABOR
client.abortCurrentDataTransfer(false); // Breaks abruptly
需要注意的是,list()和listNames() 方法暗中包含了數(shù)據(jù)傳輸器,因abortCurrentDataTransfer() 方法也可以用來中斷其list過程.
當(dāng)數(shù)據(jù)傳輸器在download(), upload(), append(), list() and listNames() 方法中中斷時,將會拋出FTPAbortedException (it.sauronsoftware.ftp4j.FTPAbortedException).
下載和上傳操作可通過restartAt 參數(shù)來重新恢復(fù):
client.download("remoteFile.ext", new java.io.File("localFile.ext"), 1056);
此操作會文件的第1056個字節(jié)處繼續(xù)執(zhí)行下載操作。第一個傳輸?shù)淖止?jié)將是第1057個.
其它 download(), upload() 和append()方法的變種可以讓你使用流來替代java.io.File對象.因此你可以在數(shù)據(jù)庫,網(wǎng)絡(luò)連接或其它流上來傳輸數(shù)據(jù)。
Active 、 passive 數(shù)據(jù)傳輸模式
客戶端和服務(wù)器之間的數(shù)據(jù)傳輸通道是通過單獨的網(wǎng)絡(luò)連接來建立的. 在傳輸通道建立期間,服務(wù)器可以是active或passive的. 服務(wù)器激活數(shù)據(jù)傳輸時,工作如下:
- client向服務(wù)器發(fā)送其IP地址和端口號.
- client向服務(wù)器發(fā)送數(shù)據(jù)傳輸請求,并在之前發(fā)送的端口上啟動監(jiān)聽.
- 服務(wù)器使用客戶端提供的地址和端口來連接客房端.
- 數(shù)據(jù)傳輸將在新建立的通道中進(jìn)行.
active模式需要你的client能夠收到來自服務(wù)器的連接.如果你的client處于防火墻, 代理或這兩者混合之后,那么大部分時間都會出現(xiàn)問題,因為它不能收到來外界的連接. 下面是passive數(shù)據(jù)傳輸模式:
- client要求服務(wù)器準(zhǔn)備好一個passive數(shù)據(jù)傳輸.
- 服務(wù)器使用其IP地址和端口號進(jìn)行響應(yīng).
- client請求傳輸和連接.
- 數(shù)據(jù)傳輸將在新建立的通道中進(jìn)行.
在passive模式中,客戶端連接不要求能收到服務(wù)器的連接請求.
在ftp4j中,你可以使用下面的調(diào)用來切換active、passive模式:
client.setPassive(false); // Active mode
client.setPassive(true); // Passive mode
ftp4j client passive 標(biāo)志的默認(rèn)值為true: 如果你沒有調(diào)用setPassive(false) ,你的客戶端在每次傳輸前,都會向服務(wù)器請求passive模式.
當(dāng)使用 passive文件傳輸時,服務(wù)器會提供一個 IP地址和一個端口號.作為FTP規(guī)范的client,需要使用給定的主機(jī)號和端口進(jìn)行連接.在商業(yè)環(huán)境中,這種行為可能會經(jīng)常帶來問題,因為NAT配置可能會阻止對IP地址的連接.這就是為什么FTP clients通常會忽略服務(wù)器返回的任何IP地址,進(jìn)而在通信線路中使用同樣的主機(jī)來連接服務(wù)器.ftp4j的行為依賴于服務(wù)器因素:
- 每個FTPConnector 都有其默認(rèn)行為.大部分連接器都會忽略服務(wù)器返回的IP地址。目前,默認(rèn)使用返回地址的連接器是FTPProxyConnector.
- 連接器的行為可通過定義名為ftp4j.passiveDataTransfer.useSuggestedAddress的系統(tǒng)屬性來覆蓋。如果設(shè)置為"true", "yes" 或"1",所有連接器都會使用服務(wù)器返回的地址,反之,如果將其設(shè)置為"false", "no" or "0", 所有服務(wù)器都不會使用返回的地址.
- 最后,連接器的默認(rèn)行為和全局設(shè)置都可以在任何連接器實例中進(jìn)行覆蓋。你可通過獲取客房端連接器,并調(diào)用其setUseSuggestedAddressForDataConnections() 方法來達(dá)到目的.
在active傳輸模式中,可以設(shè)置下面的系統(tǒng)屬性:
ftp4j.activeDataTransfer.hostAddress
主機(jī)地址.當(dāng)服務(wù)器請求執(zhí)行與客戶端連接時,client會跳轉(zhuǎn)到給定地址的服務(wù)器. 此值應(yīng)該是一個有效的IPv4地址,如:178.12.34.167. 如果沒有提供此值,客戶端會自動解析系統(tǒng)地址.但如果client運(yùn)行于LAN中,為了激活數(shù)據(jù)傳輸,將會使用帶端口轉(zhuǎn)發(fā)的路由器來連接外部服務(wù)器,那么自動探測到的地址可能不是正確的. 當(dāng)系統(tǒng)有多個網(wǎng)絡(luò)接口時,也可能發(fā)生這種情況.通常使用系統(tǒng)屬性,可以解決這種問題
ftp4j.activeDataTransfer.portRange
連接端口范圍. client會在其中挑選一個來進(jìn)行數(shù)據(jù)傳輸.此值 必須是start-stop 形式 ,如6000-7000 表示client只會在給定范圍內(nèi)挑選一個端口來連接服務(wù)器.默認(rèn)情況下沒有指定端口范圍:這表示client會挑選任何一個可用的端口.
ftp4j.activeDataTransfer.acceptTimeout
以毫秒為單位的連接超時時間. 如果服務(wù)器不能在給定超時時間內(nèi)連接client,傳輸會因FTPDataTransferException異常而中斷.0值表示永不超時。默認(rèn)值30000 (即30秒).
要設(shè)置系統(tǒng)屬性,你可以:
用一個或多個 -Dproperty=value參數(shù)來啟動JVM.如:
java -Dftp4j.activeDataTransfer.hostAddress=178.12.34.167 -Dftp4j.activeDataTransfer.portRange=6000-7000 -Dftp4j.activeDataTransfer.acceptTimeout=5000 MyClass
直接在代碼中設(shè)置系統(tǒng)屬性,如:
System.setProperty("ftp4j.activeDataTransfer.hostAddress", "178.12.34.167");
System.setProperty("ftp4j.activeDataTransfer.portRange", "6000-7000");
System.setProperty("ftp4j.activeDataTransfer.acceptTimeout", "5000");
二進(jìn)制和文本數(shù)據(jù)傳輸類型
數(shù)據(jù)傳輸?shù)牧硪粋€核心概念是binary 和textual 類型.當(dāng)傳傳輸?shù)奈募嵌M(jìn)制文件時,它將視為二進(jìn)制流,服務(wù)器會按原樣存儲。而文本數(shù)據(jù)傳輸會將傳輸?shù)奈募暈樽址?會進(jìn)行字符集轉(zhuǎn)換. 假設(shè)你的client正運(yùn)行Windows平臺上,而服務(wù)器運(yùn)行UNIX上,它們的默認(rèn)字符集通常是不同的. client以文本類型來發(fā)送文件時,client會假設(shè)文件是按機(jī)器標(biāo)準(zhǔn)字符集來編碼的,因此在發(fā)送前,它會解碼每個字符并將其編碼為 中間字符集. 服務(wù)器收到流后,在存儲前,會解碼中間字符集,并將其編碼為機(jī)器默認(rèn)的字符集.字節(jié)雖然被改變了,但內(nèi)容是相同的。
你可以調(diào)用下面的方法選擇你傳輸?shù)念愋?
client.setType(FTPClient.TYPE_TEXTUAL);
client.setType(FTPClient.TYPE_BINARY);
client.setType(FTPClient.TYPE_AUTO);
默認(rèn)的TYPE_AUTO常量 ,會讓client自動來挑選類型:如果文件的擴(kuò)展名是client能被識別的文本類型標(biāo)記,那么它會選擇文本傳輸器來執(zhí)行. 文件擴(kuò)展名是通過FTPTextualExtensionRecognizer (it.sauronsoftware.ftp4j.FTPTextualExtensionRecognizer) 實例來識別的. 默認(rèn)擴(kuò)展識別器是it.sauronsoftware.ftp4j.recognizers.DefaultTextualExtensionRecognizer, 會將下面的視為文本類型:
abc acgi aip asm asp c c cc cc com conf cpp
csh css cxx def el etx f f f77 f90 f90 flx
for for g h h hh hh hlb htc htm html htmls
htt htx idc jav jav java java js ksh list
log lsp lst lsx m m mar mcf p pas php pl pl
pm py rexx rt rt rtf rtx s scm scm sdml sgm
sgm sgml sgml sh shtml shtml spc ssi talk
tcl tcsh text tsv txt uil uni unis uri uris
uu uue vcs wml wmls wsc xml zsh
你可通過實現(xiàn)FTPTextualExtensionRecognizer 接口來實現(xiàn)你自己的識別器,但你可以更喜歡使用 class ParametricTextualExtensionRecognizer(it.sauronsoftware.ftp4j.recognizers.ParametricTextualExtensionRecognizer)便利類.
無論如何,都不要忘記將你的識別器設(shè)置在client中:
client.setTextualExtensionRecognizer(myRecognizer);
數(shù)據(jù)傳輸壓縮
有些服務(wù)器支持?jǐn)?shù)據(jù)傳輸壓縮特性-MODE Z. 在傳輸大文件時,此特性可以節(jié)省帶寬.一旦client連上服務(wù)器并通過認(rèn)證,就可通過調(diào)用下面的方法來檢查是否支持壓縮:
boolean compressionSupported = client.isCompressionSupported();
如果服務(wù)器端支持壓縮,就可通過下面的調(diào)用來啟用壓縮:
client.setCompressionEnabled(true);
在此調(diào)用之后,后續(xù)的數(shù)據(jù)傳輸(下載,上傳,列舉操作)都被將壓縮以節(jié)省帶寬.
數(shù)據(jù)傳輸壓縮可通過下面的調(diào)用來禁用:
client.setCompressionEnabled(false);
也可以檢查標(biāo)記值:
boolean compressionEnabled = client.isCompressionEnabled();
請注意:壓縮數(shù)據(jù)傳輸只當(dāng)壓縮支持且啟用了的情況下才會發(fā)生.
默認(rèn)情況下,壓縮是禁用的,即便是服務(wù)器支持壓縮. 如果有需要,可以顯示地打開.
不做任何事(NOOPing the server)
假設(shè)你的client什么事情都不做,因為在等待用戶輸入. 通常情況下, FTP服務(wù)器會自動斷開非活躍客戶端. 為了避免超時,你可以發(fā)送NOOP命令.
此命令不會做任何事情,但它會向服務(wù)器說明:客戶端仍然還活著,請重圍超時計數(shù)器.調(diào)用如下:
client.noop();
當(dāng)非活躍超時發(fā)生時,客戶端也可以自動發(fā)送NOOPs. 默認(rèn)情況下,此特性是禁用的。它可以在 setAutoNoopTimeout() 方法中設(shè)置超時時間時啟用,并提供一個毫秒為單位的值.如:
client.setAutoNoopTimeout(30000);
使用此值,client會在30秒后發(fā)送一個NOOP命令.
NOOP超時可通過設(shè)置小于等于0的值來禁用:
client.setAutoNoopTimeout(0);
網(wǎng)站特殊的自定義命令
你可以像下面這樣來發(fā)送站點特殊命令:
FTPReply reply = client.sendSiteCommand("YOUR COMMAND");
你也可以發(fā)送自定義命令:
FTPReply reply = client.sendCustomCommand("YOUR COMMAND");
sendSiteCommand() 和 sendCustomCommand() 都會返回一個FTPReply (it.sauronsoftware.ftp4j.FTPReply)對象.使用此對象,你可以檢查服務(wù)器的響應(yīng)代碼和消息.
FTPCodes (it.sauronsoftware.ftp4j.FTPCodes) 接口報告了一些通用的FTP響應(yīng)代碼,因此你可以使用這些包中的某個來進(jìn)行匹配.
異常處理
ftp4j 包定義了五種類型的異常:
- FTPException (it.sauronsoftware.ftp4.FTPException)
依賴于方法,這會報告拋出了一個FTP故障.你可以檢查報告的錯誤碼,使用FTPCodes 常量來獲取故障原因的詳細(xì)信息. - FTPIllegalReplyException (it.sauronsoftware.ftp4.FTPIllegalReplyException)
這表示遠(yuǎn)程服務(wù)器使用非法方式進(jìn)行了應(yīng)答, 這與FTP是不兼容的. 這應(yīng)該是非常罕見的. - FTPListParseException (it.sauronsoftware.ftp4.FTPListParseException)
這通常發(fā)生在list()方法,如果服務(wù)器發(fā)回的響應(yīng)不能被客戶端包中現(xiàn)有解析器進(jìn)行的話,就會拋出此種異常 - FTPDataTransferException (it.sauronsoftware.ftp4.FTPDataTransferException)
當(dāng)數(shù)據(jù)傳輸 (download, upload, but also list and listNames) 因網(wǎng)絡(luò)連接錯誤失敗時,就會拋出此種異常. - FTPAbortedException (it.sauronsoftware.ftp4.FTPAbortedException)
當(dāng)數(shù)據(jù)傳輸 (download, upload, but also list and listNames) 因客戶端發(fā)出中斷請求失敗時,拋出的異常.