熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

對JAVA的兩個FTP包進行比較分析

2013-11-23 19:32:26  來源: Java核心技術 

  ftp*;

  這是一個不被官方支持的但是放在JDK下面的FTP包正因為不被支

  持所以沒有官方提供API這是其最大的缺陷之一最重要由於不是官方支持的

  所以文檔也是沒有的

  [url]l[/url]

  這裡有該包的API

  先給一個簡單的例子(例子來源互聯網)

  )顯示FTP服務器上的文件

  void ftpList_actionPerformed(ActionEvent e) {

  String server=serverEditgetText();//輸入的FTP服務器的IP地址

  String user=userEditgetText(); file://登/錄FTP服務器的用戶名

  String password=passwordEditgetText();//登錄FTP服務器的用戶名的口令

  String path=pathEditgetText();//FTP服務器上的路徑

  try {

  FtpClient ftpClient=new FtpClient();//創建FtpClient對象

  ftpClientopenServer(server);//連接FTP服務器

  ftpClientlogin(user password);//登錄FTP服務器

  if (pathlength()!=) ftpClientcd(path);

  TelnetInputStream is=ftpClientlist();

  int c;

  while ((c=isread())!=) {

  Systemoutprint((char) c);}

  isclose();

  ftpClientcloseServer();//退出FTP服務器

  } catch (IOException ex) {;}

  }

  )從FTP服務器上下傳一個文件

  void getButton_actionPerformed(ActionEvent e) {

  String server=serverEditgetText();

  String user=userEditgetText();

  String password=passwordEditgetText();

  String path=pathEditgetText();

  String filename=filenameEditgetText();

  try {

  FtpClient ftpClient=new FtpClient();

  ftpClientopenServer(server);

  ftpClientlogin(user password);

  if (pathlength()!=) ftpClientcd(path);

  ftpClientbinary();

  TelnetInputStream is=ftpClientget(filename);

  File file_out=new File(filename);

  FileOutputStream os=new

  FileOutputStream(file_out);

  byte[] bytes=new byte[];

  int c;

  while ((c=isread(bytes))!=) {

  oswrite(bytesc);

  }

  isclose();

  osclose();

  ftpClientcloseServer();

  } catch (IOException ex) {;}

  }

  )向FTP服務器上上傳一個文件

  void putButton_actionPerformed(ActionEvent e) {

  String server=serverEditgetText();

  String user=userEditgetText();

  String password=passwordEditgetText();

  String path=pathEditgetText();

  String filename=filenameEditgetText();

  try {

  FtpClient ftpClient=new FtpClient();

  ftpClientopenServer(server);

  ftpClientlogin(user password);

  if (pathlength()!=) ftpClientcd(path);

  ftpClientbinary();

  TelnetOutputStream os=ftpClientput(filename);

  File file_in=new File(filename);

  FileInputStream is=new FileInputStream(file_in);

  byte[] bytes=new byte[];

  int c;

  while ((c=isread(bytes))!=){

  oswrite(bytesc);}

  isclose();

  osclose();

  ftpClientcloseServer();

  } catch (IOException ex) {;}

  }

  }

  看了這個例子應該就能用他寫東西了

  這個包缺點很多首先就是不被支持也不被官方推薦使用

  其次是這個包功能過於簡單簡單到無法區分FTP服務器上的File是文件還是目錄有人說

  通過返回的字符串來判斷但是據說FTP在不同系統下返回的東西不大一樣所以如果通過

  判斷字符串會有不好移植的問題

  自己想出了一個辦法通過FtpClient中的cd方法來判斷

  代碼如下

  try{

  ftpcd(file);//file為當前判斷的文件

  //如果過了說明file是目錄

  }

  catch(IOException e){

  //說明file是文件

  }

  finally{

  ftpcd();//返回上級目錄繼續判斷下一文件

  }

  我用這種方法做過嘗試結果是只能判斷正確一部分有些目錄仍會被認做文件不知道

  是我的方法有錯還是別的什麼原因

  如果對FTP服務沒有過高的要求使用這個包還是不錯的因為他本身就包含在JDK中

  存在CLASSPATH的問題不需要導入外部包較為方便

  ftp*;

  這個包在Jakarta Commons Net library裡現在的最高版本是可以從以下地址

  下載

  [url]net[/url]

  zip

  裡面包含了打包好的jarAPI及全部的class文件

  [url]net[/url]

  srczip

  這裡包含一些例子以及全部的代碼

  給出一個該包的例子

  

  import ftp*;

  

  public static void getDataFiles( String server

  String username

  String password

  String folder

  String destinationFolder

  Calendar start

  Calendar end )

  {

  try

  {

  // Connect and logon to FTP Server

  FTPClient ftp = new FTPClient();

  nnect( server );

  ftplogin( username password );

  Systemoutprintln(Connected to +

  server + );

  Systemoutprint(ftpgetReplyString());

  // List the files in the directory

  ftpchangeWorkingDirectory( folder );

  FTPFile[] files = ftplistFiles();

  Systemoutprintln( Number of files in dir: + fileslength );

  DateFormat df = DateFormatgetDateInstance( DateFormatSHORT );

  for( int i=; i

  {

  Date fileDate = files[ i ]getTimestamp()getTime();

  if( pareTo( startgetTime() ) >= &&

  pareTo( endgetTime() ) <= )

  {

  // Download a file from the FTP Server

  Systemoutprint( dfformat( files[ i ]getTimestamp()getTime() ) );

  Systemoutprintln( \t + files[ i ]getName() );

  File file = new File( destinationFolder +

  Fileseparator + files[ i ]getName() );

  FileOutputStream fos = new FileOutputStream( file );

  ftpretrieveFile( files[ i ]getName() fos );

  fosclose();

  filesetLastModified( fileDategetTime() );

  }

  }

  // Logout from the FTP Server and disconnect

  ftplogout();

  ftpdisconnect();

  }

  catch( Exception e )

  {

  eprintStackTrace();

  }

  }

  同ftp相同都是先建立FtpClient(注意兩包的大小寫不同)的實例然後通過

  connect()方法連接login()方法登陸但是ftp*明顯比sun

  netftp功能強大很多

  ftp*包將FTP中的file單獨出來成為了一個新類FTPFile還有

  類FTPFileEntryParserparse沒有仔細研究但是從字面來看應該是轉化為某種形勢的

  類有待研究

  同時這個commonsnetjar包中也提供了FTP服務器telnetmail等一系列類庫

  ftp*包的缺點在於需要設置classpath並且需要下載jakarta

  orojar這個包才能運行(如果沒有這個包會在ftplistFiles()方法後拋出找不

  到class異常)此包無須在代碼中import只需設置在classpath中即可下載地址

  [url]orozip[/url]

  如果想要強大的FTP服務那麼ftp*包應該是你的最好選擇

  且也是開源免費的

  這個包的問題是:

  使用Jakarta Commons Net library需要在環境變量裡面編輯classpath

  這是不方便的地方

  另外IBM也有提供一個ftp包大家有興趣可以搜索一下


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27057.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.