使用Java連接FTP服務器進行下載和上傳
先說一下如何在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(); } } }