1. 程式人生 > >sun公司和apache使用ftpclient的區別

sun公司和apache使用ftpclient的區別

serve lse cli iteye tpc comm public catch com

  最近因為使用FTP實現上傳下載,因為已經有前輩使用了,照著敲了一遍(絕對沒有復制粘貼啊,發誓)。但是今天突然發現FTPClient還不一樣,仔細看了看,一個是sun.net.ftp.FtpClient,一個是org.apache.commons.net.ftp.FTPClient,嚇得我趕緊在網上找了找區別,仔細一看區別不是太大,還是不夠細心啊,一開始竟然沒發現不一樣,還好亡羊補牢為時未晚。

首先我們來看一下sun的FtpClient代碼:

public static boolean uploadFileBySun(StringBuffer fileContent,String server,String userName, String userPassword, String path, 
    String fileName) { FtpClient ftpClient
= new FtpClient(); try { //打開ftp服務器 ftpClient.openServer(server); //使用指定用戶登錄 ftpClient.login(userName, userPassword); //轉到指定路徑 ftpClient.cd(path); TelnetOutputStream os
= null; //新建一個文件 // os = ftpClient.put(new String(fileName.getBytes("GBK"), "iso-8859-1")); os = ftpClient.put(fileName); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw
= new BufferedWriter(osw); bw.write(fileContent.toString()); bw.flush(); bw.close(); } catch (Exception e) { System.out.println(e.getMessage()); return false; } finally { try { //關閉ftp連接 ftpClient.closeServer(); } catch (Exception e) { e.printStackTrace(); } } return true; }

  正如上面的代碼,上傳文件分為六步,第一步,打開ftp服務器,第二步,使用指定用戶名以及密碼登陸,第三步,轉到指定文件路徑,第四步,創建一個文件,第五步,往文件裏面寫東西,並關閉文件,第六步,釋放ftp連接。最後一步釋放ftp連接很重要,一般ftp服務器連接數都是有限的,所以不管文件上傳成功或是失敗都必須釋放連接。

  上面這個例子上傳的文件是字符串文本,必須要提的是,如果上傳的字符串文本較長(我項目中上傳的文本大概在160kb上下),使用上面的方法可能會出現字符串丟失的情況,原因不明,可能跟緩存有關,所以如果文本較長,建議用戶使用字節流。還有一個問題,如果要上傳的文件名是中文的話,上傳的文件名將是亂碼,亂碼問題我嘗試許多轉碼也解決不了,於是不得不使用下面的方法了。

接下來就是Apache的FTPClient代碼:

public static boolean uploadFileByApacheByBinary(StringBuffer fileContent,String server,String userName, String userPassword, 
    String path, String fileName) { FTPClient ftpClient
= new FTPClient(); try { InputStream is = null; is = new ByteArrayInputStream(fileContent.toString().getBytes()); ftpClient.connect(server); ftpClient.login(userName, userPassword); ftpClient.changeWorkingDirectory(path); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.storeFile(new String(fileName.getBytes("GBK"), "iso-8859-1") , is); is.close(); } catch (Exception e) { e.printStackTrace(); return false; } finally { if(ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } return true; }

  Apache上傳文件的步驟跟sun的實現基本一致,只是方法名有些區別而已。在這裏我將字符串文本轉換成了ByteArrayInputStream字節緩沖流,這是個很有用的東西,常用來進行字符到流的轉換。轉換成字節上傳就不會出現丟失文件內容的情況了。

  ftpClient.storeFile(new String(fileName.getBytes(“GBK”), “iso-8859-1″) , is)這句代碼將is輸入流的東西上傳到ftp服務器的fileName文件中,在這裏我們對fileName文件名進行了轉碼,經測試中文沒有亂碼(ftp服務器使用的是window,其他平臺未測試),而如果我們使用sun的ftp實現,即使文件名進行這樣類似的轉碼,依然是亂碼。
  兩種方法大家可以根據自己需要選擇, 如果使用Apache的FTPClient的,我們需要在工程裏面加入commons-net.jar。

原文轉自:http://ower22.iteye.com/blog/2126633

sun公司和apache使用ftpclient的區別