使用Java連接FTP服務器進行下載和上傳

jopen 12年前發布 | 108K 次閱讀 Java Java開發

先說一下如何在eclipse里使用sun.net的包的方法


sun.net包里的,在eclipse里默認是不讓用的。解決辦法是自定義access rules  

在工程上右鍵->工程屬性->java builder path->Libraries標簽,點擊JRE System Library里面的Access rules,add sun/** 為accessible,如果該項存在,就edit。


sun.net.ftp.FtpClient類中函數的說明

sun.net.ftp.FtpClient.,該類庫主要提供了用于建立FTP連接的類。利用這些類的方法,編程人員可以遠程登錄到FTP服務器,列舉該服務器上的目錄,設置傳輸協議,以及傳送文件。FtpClient類涵蓋了幾乎所有FTP的功能,FtpClient的實例變量保存了有關建立"代理" 的各種信息。下面給出了這些實例變量。

  public static boolean useFtpProxy

  這個變量用于表明FTP傳輸過程中是否使用了一個代理,因此,它實際上是一個標記,此標記若為TRUE,表明使用了一個代理主機。

  public static String ftpProxyHost

  此變量只有在變量useFtpProxy為TRUE時才有效,用于保存代理主機名。

  public static int ftpProxyPort

  此變量只有在變量useFtpProxy為TRUE時才有效,用于保存代理主機的端口地址。

  FtpClient有三種不同形式的構造函數,如下所示:

  1、public FtpClient(String hostname,int port)

   此構造函數利用給出的主機名和端口號建立一條FTP連接。

  2、public FtpClient(String hostname)

  此構造函數利用給出的主機名建立一條FTP連接,使用默認端口號。

  3、FtpClient()

  此構造函數將創建一FtpClient類,但不建立FTP連接。這時,FTP連接可以用openServer方法建立。

  一旦建立了類FtpClient,就可以用這個類的方法來打開與FTP服務器的連接。類ftpClient提供了如下兩個可用于打開與FTP服務器之間的連接的方法。

  public void openServer(String hostname)

  這個方法用于建立一條與指定主機上的FTP服務器的連接,使用默認端口號。

  public void openServer(String host,int port)

  這個方法用于建立一條與指定主機、指定端口上的FTP服務器的連接。

  打開連接之后,接下來的工作是注冊到FTP服務器。這時需要利用下面的方法。

  public void login(String username,String password)

  此方法利用參數username和password登錄到FTP服務器。使用過Intemet的用戶應該知道,匿名FTP服務器的登錄用戶名為anonymous,密碼一般用自己的電子郵件地址。

  下面是FtpClient類所提供的一些控制命令。

  public void cd(String remoteDirectory)

  該命令用于把遠程系統上的目錄切換到參數remoteDirectory所指定的目錄。

  public void cdUp():該命令用于把遠程系統上的目錄切換到上一級目錄。

  public String pwd():該命令可顯示遠程系統上的目錄狀態。

  public void binary():該命令可把傳輸格式設置為二進制格式。

  public void ascii():該命令可把傳輸協議設置為ASCII碼格式。

  public void rename(String string,String string1)

  該命令可對遠程系統上的目錄或者文件進行重命名操作。

  除了上述方法外,類FtpClient還提供了可用于傳遞并檢索目錄清單和文件的若干方法。這些方法返回的是可供讀或寫的輸入、輸出流。下面是其中一些主要的方法。

  public TelnetInputStream list()

  返回與遠程機器上當前目錄相對應的輸入流。

  public TelnetInputStream get(String filename)

  獲取遠程機器上的文件filename,借助TelnetInputStream把該文件傳送到本地。

  public TelnetOutputStream put(String filename)

  以寫方式打開一輸出流,通過這一輸出流把文件filename傳送到遠程計算機。

以下是使用 sun.net.ftp.FtpClient 進行上傳和下載的例子

package com.gpower.web.trial;

import java.io.DataInputStream;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.io.FileInputStream;   
import java.util.ArrayList;   
import java.util.Date;   
import java.util.List;   
import sun.net.*;   
import sun.net.ftp.FtpClient;

public class FtpUtil {

    FtpClient ftpClient;

    /**  
     * connectServer  
     * 連接ftp服務器  
     * @throws java.io.IOException  
     * @param path 文件夾,空代表根目錄  
     * @param password 密碼  
     * @param user    登陸用戶  
     * @param server 服務器地址  
     */   
  public void connectServer(String server, String user, String password,  String path)   
  throws IOException   
   {   
     // server:FTP服務器的IP地址;user:登錄FTP服務器的用戶名   
     // password:登錄FTP服務器的用戶名的口令;path:FTP服務器上的路徑   
      ftpClient = new FtpClient();   
      ftpClient.openServer(server);   
      ftpClient.login(user, password);   
     //path是ftp服務下主目錄的子目錄   
     if (path.length() != 0)   ftpClient.cd(path);   
     //用2進制上傳、下載   
      ftpClient.binary();        
}   

/**  
     * upload  
     * 上傳文件  
     * @throws java.lang.Exception  
     * @return -1 文件不存在  
     *           -2 文件內容為空  
     *           >0 成功上傳,返回文件的大小  
     * @param newname 上傳后的新文件名  
     * @param filename 上傳的文件  
     */   
public long upload(String filename,String newname) throws Exception   
{   
     long result = 0;   
      TelnetOutputStream os = null;   
      FileInputStream is = null;   
     try {            
          java.io.File file_in = new java.io.File(filename);   
         if (!file_in.exists()) return -1;   
         if (file_in.length()==0) return -2;   
          os = ftpClient.put(newname);   
          result = file_in.length();   
          is = new FileInputStream(file_in);   
         byte[] bytes = new byte[1024];   
         int c;   
         while ((c = is.read(bytes)) != -1) {   
               os.write(bytes, 0, c);   
          }   
      } finally {   
         if (is != null) {   
              is.close();   
          }   
         if (os != null) {   
             os.close();   
          }   
      }   
    return result;   
}   
/**  
     * upload  
     * @throws java.lang.Exception  
     * @return  
     * @param filename  
     */   
public long upload(String filename)   
throws Exception   
{   
    String newname = "";   
    if (filename.indexOf("/")>-1)   
     {   
        newname = filename.substring(filename.lastIndexOf("/")+1);   
     }else   
     {   
        newname = filename;   
     }   
    return upload(filename,newname);   
}   

/**  
     *   download  
     *   從ftp下載文件到本地  
     * @throws java.lang.Exception  
     * @return  
     * @param newfilename 本地生成的文件名  
     * @param filename 服務器上的文件名  
     */   
public long download(String filename,String newfilename)   
throws Exception   
{     
    long result = 0;   
     TelnetInputStream is = null;   
     FileOutputStream os = null;   
    try   
     {   
        is = ftpClient.get(filename);          
        java.io.File outfile = new java.io.File(newfilename);   
        os = new FileOutputStream(outfile);   
       byte[] bytes = new byte[1024];   
       int c;   
       while ((c = is.read(bytes)) != -1) {   
            os.write(bytes, 0, c);   
            result = result + c;   
        }   
     } catch (IOException e)   
     {   
        e.printStackTrace();   
     }   
    finally {   
         if (is != null) {   
              is.close();   
          }   
         if (os != null) {   
             os.close();   
          }   
      }   
     return result;   
}   
/**  
   * 取得某個目錄下的所有文件列表  
   *  
   */   
public List getFileList(String path)   
{   
     List list = new ArrayList();   
    try   
     {   
        DataInputStream dis = new   DataInputStream(ftpClient.nameList(path));   
       String filename = "";   
       while((filename=dis.readLine())!=null)     
        {     
          list.add(filename);           
        }     

     } catch (Exception e)   
     {   
        e.printStackTrace();   
     }   
    return list;   
}   

/**  
     * closeServer  
     * 斷開與ftp服務器的鏈接  
     * @throws java.io.IOException  
     */   
public void closeServer()   
throws IOException   
{      
   try   
    {   
      if (ftpClient != null)   
       {   
         ftpClient.closeServer();        
       }   
    } catch (IOException e) {   
       e.printStackTrace();   
    }   
}   

  public static void main(String [] args) throws Exception   
   {   
     FtpUtil ftp = new FtpUtil();   
    try {   
         //連接ftp服務器   
          ftp.connectServer("192.168.8.32", "admin", "123456", "201212");   
         /**   上傳文件到 info2 文件夾下 */   
          System.out.println("filesize:"+ftp.upload("f:/download/Install.exe")+"字節");   
         /** 取得info2文件夾下的所有文件列表,并下載到 E盤下 */   
          List list = ftp.getFileList(".");   
         for (int i=0;i<list.size();i++)   
          {   
            String filename = (String)list.get(i);   
             System.out.println(filename);   
             ftp.download(filename,"E:/"+filename);   
          }   
     } catch (Exception e) {   
       ///   
     }finally   
     {   
        ftp.closeServer();   
     }   
   }

} 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!