posts - 108,comments - 56,trackbacks - 0
               最近寫了一個FTP客服端的程序,可以實現(xiàn)上傳,下載,列出文件,刪除文件,重命名文件操作。

               SUN也提供了FTP操作的包,但是官方建議不要使用,而且沒有API文檔。另外IBM和APACHE也提供了相應(yīng)的FTP包,APACHE的包功能比較強大,IBM的沒有用過,不知道怎樣。

               我把我的代碼貼出來,希望和大家一起交流。
          package woxingwosu;

          import java.io.BufferedInputStream;
          import java.io.BufferedOutputStream;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.text.SimpleDateFormat;
          import java.util.Comparator;
          import java.util.Properties;
          import java.util.TreeSet;

          import org.apache.commons.io.FileUtils;
          import org.apache.commons.net.ftp.FTP;
          import org.apache.commons.net.ftp.FTPClient;
          import org.apache.commons.net.ftp.FTPClientConfig;
          import org.apache.commons.net.ftp.FTPFile;
          import org.apache.commons.net.ftp.FTPReply;

          /**
           * 其實JDK里面也有支持FTP操作的包【jre/lib下的rt.jar】,但是SUN的DOC里面并沒有提供相應(yīng)文檔,
           * 因為這里面的包,不被官方支持,建議不要使用。我們可以使用第三方提供的包apache.commons。
           * apache.commons的包,都有文檔,方便使用
           * 另外IBM也有提供一個ftp包,我沒有用過,有興趣的可以去研究一下
           * @commons-net:
          http://apache.mirror.phpchina.com/commons/net/binaries/commons-net-1.4.1.zip
           * @jakarta-oro:
          http://mirror.vmmatrix.net/apache/jakarta/oro/source/jakarta-oro-2.0.8.zip 
           * @commons-io:
          http://apache.mirror.phpchina.com/commons/io/binaries/commons-io-1.3.2-bin.zip
           * 
          @author 我行我素
           * @2007-08-03
           
          */
          public class MiniFtp {
              
          private static String username;
              
          private static String password;
              
          private static String ip;
              
          private static int port;
              
          private static Properties property=null;//配置
              private static String configFile;//配置文件的路徑名
              
              
          private static FTPClient ftpClient=null;
              
          private static SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm");
              
              
          private static final String [] FILE_TYPES={"文件","目錄","符號鏈接","未知類型"};
              
              
          public static void main(String[] args) {
                  setConfigFile(
          "woxingwosu.properties");//設(shè)置配置文件路徑
                  connectServer();
                  listAllRemoteFiles();
          //列出所有文件和目錄
                  changeWorkingDirectory("webroot");//進入文件夾webroot
                  listRemoteFiles("*.jsp");//列出webroot目錄下所有jsp文件
                  setFileType(FTP.BINARY_FILE_TYPE);//設(shè)置傳輸二進制文件
                  uploadFile("woxingwosu.xml","myfile.xml");//上傳文件woxingwosu.xml,重新命名為myfile.xml
                  renameFile("viewDetail.jsp""newName.jsp");//將文件viewDetail.jsp改名為newName.jsp
                  deleteFile("UpdateData.class");//刪除文件UpdateData.class
                  loadFile("UpdateData.java","loadFile.java");//下載文件UpdateData.java,并且重新命名為loadFile.java
                  closeConnect();//關(guān)閉連接
              }
              
              
          /**
               * 上傳文件
               * 
          @param localFilePath--本地文件路徑
               * 
          @param newFileName--新的文件名
               
          */
              
          public static void uploadFile(String localFilePath,String newFileName){
                  connectServer();
                  
          //上傳文件
                  BufferedInputStream buffIn=null;
                  
          try{
                      buffIn
          =new BufferedInputStream(new FileInputStream(localFilePath));
                      ftpClient.storeFile(newFileName, buffIn);
                  }
          catch(Exception e){
                      e.printStackTrace();
                  }
          finally{
                      
          try{
                          
          if(buffIn!=null)
                              buffIn.close();
                      }
          catch(Exception e){
                          e.printStackTrace();
                      }
                  }
              }
              
              
          /**
               * 下載文件
               * 
          @param remoteFileName --服務(wù)器上的文件名
               * 
          @param localFileName--本地文件名
               
          */
              
          public static void loadFile(String remoteFileName,String localFileName){
                  connectServer();
                  
          //下載文件
                  BufferedOutputStream buffOut=null;
                  
          try{
                      buffOut
          =new BufferedOutputStream(new FileOutputStream(localFileName));
                      ftpClient.retrieveFile(remoteFileName, buffOut);
                  }
          catch(Exception e){
                      e.printStackTrace();
                  }
          finally{
                      
          try{
                          
          if(buffOut!=null)
                              buffOut.close();
                      }
          catch(Exception e){
                          e.printStackTrace();
                      }
                  }
              }
              
              
          /**
               * 列出服務(wù)器上所有文件及目錄
               
          */
              
          public static void listAllRemoteFiles(){
                  listRemoteFiles(
          "*");
              }
              
              
          /**
               * 列出服務(wù)器上文件和目錄
               * 
          @param regStr --匹配的正則表達式
               
          */
              @SuppressWarnings(
          "unchecked")
              
          public static void listRemoteFiles(String regStr){
                  connectServer();
                  
          try{
                      FTPFile[] files
          =ftpClient.listFiles(regStr);
                      
          if(files==null||files.length==0)
                          System.out.println(
          "There has not any file!");
                      
          else{
                          TreeSet
          <FTPFile> fileTree=new TreeSet(
                                  
          new Comparator(){
                                      
          //先按照文件的類型排序(倒排),然后按文件名順序排序
                                      public int compare(Object objFile1,Object objFile2){
                                          
          if(objFile1==null)
                                              
          return -1;
                                          
          else if(objFile2==null)
                                              
          return 1;
                                          
          else{
                                              FTPFile file1
          =(FTPFile)objFile1;
                                              FTPFile file2
          =(FTPFile)objFile2;
                                              
          if(file1.getType()!=file2.getType())
                                                  
          return file2.getType()-file1.getType();
                                              
          else
                                                  
          return file1.getName().compareTo(file2.getName());
                                          }
                                      }
                                  }
                          );
                          
          for(FTPFile file:files)
                              fileTree.add(file);
                          System.out.printf(
          "%-35s%-10s%15s%15s\n","名稱","類型","修改日期","大小");
                          
          for(FTPFile file:fileTree){
                              System.out.printf(
          "%-35s%-10s%15s%15s\n",iso8859togbk(file.getName()),FILE_TYPES[file.getType()]
                                      ,dateFormat.format(file.getTimestamp().getTime()),FileUtils.byteCountToDisplaySize(file.getSize()));
                          }
                      }
                  }
          catch(Exception e){
                      e.printStackTrace();
                  }
              }
              
              
          /**
               * 關(guān)閉連接
               
          */
              
          public static void closeConnect(){
                  
          try{
                      
          if(ftpClient!=null){
                          ftpClient.logout();
                          ftpClient.disconnect();
                      }
                  }
          catch(Exception e){
                      e.printStackTrace();
                  }
              }
              
              
          /**
               * 設(shè)置配置文件
               * 
          @param configFile
               
          */
              
          public static void setConfigFile(String configFile) {
                  MiniFtp.configFile 
          = configFile;
              }
              
              
          /**
               * 設(shè)置傳輸文件的類型[文本文件或者二進制文件]
               * 
          @param fileType--BINARY_FILE_TYPE、ASCII_FILE_TYPE 
               
          */
              
          public static void setFileType(int fileType){
                  
          try{
                      connectServer();
                      ftpClient.setFileType(fileType);
                  }
          catch(Exception e){
                      e.printStackTrace();
                  }
              }
              
              
          /**
               * 擴展使用
               * 
          @return
               
          */
              
          protected static FTPClient getFtpClient(){
                  connectServer();
                  
          return ftpClient;
              }

              
          /**
               * 設(shè)置參數(shù)
               * 
          @param configFile --參數(shù)的配置文件
               
          */
              
          private static void setArg(String configFile){
                  property
          =new Properties();
                  BufferedInputStream inBuff
          =null;
                  
          try{
                      inBuff
          =new BufferedInputStream(new FileInputStream(configFile));
                      property.load(inBuff);
                      username
          =property.getProperty("username");
                      password
          =property.getProperty("password");
                      ip
          =property.getProperty("ip");
                      port
          =Integer.parseInt(property.getProperty("port"));
                  }
          catch(Exception e){
                      e.printStackTrace();
                  }
          finally{
                      
          try{
                          
          if(inBuff!=null)
                              inBuff.close();
                      }
          catch(Exception e){
                          e.printStackTrace();
                      }
                  }
              }
              
              
          /**
               * 連接到服務(wù)器
               
          */
              
          public static void connectServer() {
                  
          if (ftpClient == null) {
                      
          int reply;
                      
          try {
                          setArg(configFile);
                          ftpClient
          =new FTPClient();
                          ftpClient.setDefaultPort(port);
                          ftpClient.configure(getFtpConfig());
                          ftpClient.connect(ip);
                          ftpClient.login(username, password);
                          ftpClient.setDefaultPort(port);
                          System.out.print(ftpClient.getReplyString());
                          reply 
          = ftpClient.getReplyCode();

                          
          if (!FTPReply.isPositiveCompletion(reply)) {
                              ftpClient.disconnect();
                              System.err.println(
          "FTP server refused connection.");
                          }
                      } 
          catch (Exception e) {
                          System.err.println(
          "登錄ftp服務(wù)器【"+ip+"】失敗");
                          e.printStackTrace();
                      }
                  }
              }
              
              
          /**
               * 進入到服務(wù)器的某個目錄下
               * 
          @param directory
               
          */
              
          public static void changeWorkingDirectory(String directory){
                  
          try{
                      connectServer();
                      ftpClient.changeWorkingDirectory(directory);
                  }
          catch(IOException ioe){
                      ioe.printStackTrace();
                  }
              }
              
              
          /**
               * 返回到上一層目錄
               
          */
              
          public static void changeToParentDirectory(){
                  
          try{
                      connectServer();
                      ftpClient.changeToParentDirectory();
                  }
          catch(IOException ioe){
                      ioe.printStackTrace();
                  }
              }
              
              
          /**
               * 刪除文件
               
          */
              
          public static void deleteFile(String filename){
                  
          try{
                      connectServer();
                      ftpClient.deleteFile(filename);
                  }
          catch(IOException ioe){
                      ioe.printStackTrace();
                  }
              }
              
              
          /**
               * 重命名文件 
               * 
          @param oldFileName --原文件名
               * 
          @param newFileName --新文件名
               
          */
              
          public static void renameFile(String oldFileName,String newFileName){
                  
          try{
                      connectServer();
                      ftpClient.rename(oldFileName, newFileName);
                  }
          catch(IOException ioe){
                      ioe.printStackTrace();
                  }
              }
              
              
          /**
               * 設(shè)置FTP客服端的配置--一般可以不設(shè)置
               * 
          @return
               
          */
              
          private static FTPClientConfig getFtpConfig(){
                  FTPClientConfig ftpConfig
          =new FTPClientConfig(FTPClientConfig.SYST_UNIX);
                  ftpConfig.setServerLanguageCode(FTP.DEFAULT_CONTROL_ENCODING);
                  
          return ftpConfig;
              }
              
              
          /**
               * 轉(zhuǎn)碼[ISO-8859-1 ->  GBK]
               *不同的平臺需要不同的轉(zhuǎn)碼
               * 
          @param obj
               * 
          @return
               
          */
              
          private static String iso8859togbk(Object obj){
                  
          try{
                      
          if(obj==null)
                          
          return "";
                      
          else
                          
          return new String(obj.toString().getBytes("iso-8859-1"),"GBK");
                  }
          catch(Exception e){
                      
          return "";
                  }
              }

          }
              配置文件[woxingwosu.properties]
          ip:192.168.168.168
          username:admin
          password:
          8008
          port:
          21
          posted on 2007-08-03 19:14 破繭而出 閱讀(4804) 評論(11)  編輯  收藏 所屬分類: Java

          FeedBack:
          # re: FTP上傳,下載
          2007-08-03 23:13 | BeanSoft
          友情支持一下!  回復(fù)  更多評論
            
          # re: FTP上傳,下載[未登錄]
          2007-08-05 11:34 | aa
          changeWorkingDirectory(String directory) 不支持多級目錄的轉(zhuǎn)換,如
          root/a/b
          我在root下直接進入b要調(diào)用兩次上面的方法,沒有直接就調(diào)用一次就進入b目錄的方法  回復(fù)  更多評論
            
          # re: FTP上傳,下載
          2007-08-06 08:39 | 平民老百姓
          @aa
          我測試是可以的,例如進入a/b目錄
          changeWorkingDirectory("a"+java.io.File.separator+"b");
          這樣就可以進入b目錄
            回復(fù)  更多評論
            
          # re: FTP上傳,下載
          2007-08-06 17:29 | Scott.Pan
          不錯,收藏了,以后應(yīng)該會由用的著參考的地方.感謝  回復(fù)  更多評論
            
          # re: FTP上傳,下載
          2007-10-06 21:23 |
          好東西  回復(fù)  更多評論
            
          # re: FTP上傳,下載
          2007-10-19 15:19 | zhy
          如果上傳或下載的文件名為中文,會出現(xiàn)亂碼,該如何解決?  回復(fù)  更多評論
            
          # re: FTP上傳,下載
          2008-01-25 14:22 | DUCK
          ftpClient.setControlEncoding("GBK");//可以解決中文問題  回復(fù)  更多評論
            
          # re: FTP上傳,下載
          2008-02-22 18:41 | octopusyu
          我想問一下,有沒有像Http上傳方式一樣的Ftp上傳,比如我在客戶端通過<input type="file" name="Location">的方式瀏覽選中一個文件,然后通過Ftp上傳到Ftp服務(wù)器中的Java實現(xiàn)示例?你這里所謂的Ftp客戶端程序,其實是從應(yīng)用服務(wù)器中上傳文件到Ftp服務(wù)器,我需要的是B/S結(jié)構(gòu)中的瀏覽器端通過Ftp上傳文件。  回復(fù)  更多評論
            
          # re: FTP上傳,下載
          2008-02-23 22:28 | 破繭而出
          @octopusyu
          Sorry,B/S下的FTP文件上傳我沒做過,不知道行不行的通
            回復(fù)  更多評論
            
          # re: FTP上傳,下載
          2008-12-02 17:42 | jjw
          great  回復(fù)  更多評論
            
          # re: FTP上傳,下載
          2015-05-18 08:07 | ftp.w3.org
          @BeanSoft
            回復(fù)  更多評論
            
          主站蜘蛛池模板: 江源县| 兴山县| 寿宁县| 永济市| 唐海县| 全椒县| 朝阳县| 大安市| 都兰县| 黔江区| 团风县| 诸暨市| 满洲里市| 长兴县| 湄潭县| 孝昌县| 墨江| 盐津县| 云霄县| 大荔县| 北安市| 开阳县| 右玉县| 南澳县| 镇雄县| 本溪| 通州市| 清丰县| 习水县| 资中县| 陕西省| 德令哈市| 循化| 晋中市| 商都县| 西宁市| 连山| 佛山市| 怀化市| 吉林市| 文山县|