天天看點

JAVA+Ftpclient操作

最近再做個ftp上傳、下載下傳的項目,用到的包是sun.net.ftp.FtpClient。本地開發測試一切正常,放到服

務器測試,程式開始罷工。無奈之下,隻能逐漸輸出日志,查找原因,現做個小結。

環境:

本地的開發環境是win7+jdk1.5,另本地搭建一個ftp伺服器,軟體使用的是serv_U。

伺服器上的環境是linux+jdk1.5.

經過分析發現,linux環境與win環境的ftp操作有以下差别:

1、檔案中的資料回車換行符不同

win的回車換行時:/r/n

linux的回車換行是:/n

解決辦法是:

1)由于unix和windows系統參數的差别,故不使用寫死進行換行,通過使用System.getProperties

("line.separator");擷取換行符

2)也可通過使用out.newLine();實作

2、ftp的根路徑不同

加入:ftp使用者名:user,密碼:11111

根目錄:win:c://upload;linux:/data/upload

子目錄:win:c://upload/abc;linux:/data/upload/abc

win系統中,以ftp的使用者名和密碼登陸後,可直接進入cd(/abc),即可進入到abc目錄

但是,在linux系統中,以ftp的使用者名和密碼登陸後,需要cd完整的路徑才可以進入目錄,即:cd(/data

/upload/abc),不可使用cd(/abc)。

是以,要注意linux系統的檔案操作時要完整的絕對路徑,而不能使用相對路徑。

3、問題總結:

由該問題可延伸至作業系統常用參數的差别,如:

line.separator(windows:"/r/n";unix:"/n");

file.separator(windows:"/";unix:"/");

path.separator(windows:";";unix:":");

4、 FTP的ASCII和Binary兩種傳輸方式有何不同

    ASCII模式和Binary模式的差別是回車換行的處理,Binary模式不對資料進行任何處理,ASCII模式将

回車換行轉換為本機的回車字元,比如:UNIX下是/n,Windows下是/r/n,Mac下是/r。

    ASCII模式下會轉換檔案,不能說是不同系統對回車換行解釋不同,而是不同的系統有不同的行結束符

。UNIX系統下行結束符是一個位元組,即十六進制的0A,而Windows的系統是兩個位元組,即十六進制的0D0A,

是以當你用ASCII方式從UNIX的FTP Server下載下傳檔案到Windows系統上時(不管是二進制或者文本檔案),每

檢測到一個位元組是0A,就會自動插入一個0D,是以如果你的檔案是二進制檔案,比如可執行檔案、壓縮包

什麼的,就肯定不能用了。如果你的檔案就是UNIX下的文本檔案,你用ASCII模式是正确的,要是誤用了

Binary模式,你在Windows上看這個檔案是沒有換行的,裡面是一個個的黑方塊,也就是當你的檔案是文本

檔案時,建議使用ASCII模式,這樣可以使用得不同的平台傳上去的檔案到另一平台時能正确顯示換行情況

,而對于可執行檔案或壓縮檔案等其它非文本檔案,最好用Binary方式,因為這個傳上去的和本機的一模

一樣,隻要你在同一個平台上就可以打開它,或都你将你的FTP伺服器放在UNIX平台上,而使用者使用

windows平台,那麼上傳上去的非文本檔案,使用者隻要下載下傳到windows平台一般就可以打開它。

    一般來說,我們最好都用Binary方式,這樣可以保證不出錯。如果有文本格式轉換的問題,即UNIX格

式的文本和DOS格式的文本之間的轉換,有很多工具可以做的,不要在ftp傳輸的時候冒險,尤其是你如果

對這些東西不是非常清楚的話。

PS:java的System.getProperty()方法可以擷取的值:

java.version  Java 運作時環境版本

java.vendor  Java 運作時環境供應商

java.vendor.url  Java 供應商的 URL

java.home  Java 安裝目錄

java.vm.specification.version  Java 虛拟機規範版本

java.vm.specification.vendor  Java 虛拟機規範供應商

java.vm.specification.name  Java 虛拟機規範名稱

java.vm.version  Java 虛拟機實作版本

java.vm.vendor  Java 虛拟機實作供應商

java.vm.name  Java 虛拟機實作名稱

java.specification.version  Java 運作時環境規範版本

java.specification.vendor  Java 運作時環境規範供應商

java.specification.name  Java 運作時環境規範名稱

java.class.version  Java 類格式版本号

java.class.path  Java 類路徑

java.library.path  加載庫時搜尋的路徑清單  7款發型秀出完美臉型

java.io.tmpdir  預設的臨時檔案路徑

java.compiler  要使用的 JIT 編譯器的名稱

java.ext.dirs  一個或多個擴充目錄的路徑

os.name  作業系統的名稱

os.arch  作業系統的架構

os.version  作業系統的版本

file.separator  檔案分隔符(在 UNIX 系統中是“/”)

path.separator  路徑分隔符(在 UNIX 系統中是“:”)

line.separator  行分隔符(在 UNIX 系統中是“/n”)

user.name  使用者的賬戶名稱

user.home  使用者的主目錄

user.dir  使用者的目前工作目錄