http://www.blogjava.net/woxingwosu/archive/2007/08/03/134311.html
FTP客服端的程序,可以实现上传,下载,列出文件,删除文件,重命名文件操作。
SUN也提供了FTP操作的包,但是官方建议不要使用,而且没有API文档。另外IBM和APACHE也提供了相应的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里面并没有提供相应文档, * 因为这里面的包,不被官方支持,建议不要使用。我们可以使用第三方提供的包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 " ); // 设置配置文件路径 connectServer(); listAllRemoteFiles(); // 列出所有文件和目录 changeWorkingDirectory( " webroot " ); // 进入文件夹webroot listRemoteFiles( " *.jsp " ); // 列出webroot目录下所有jsp文件 setFileType(FTP.BINARY_FILE_TYPE); // 设置传输二进制文件 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(); // 关闭连接 } /** * 上传文件 * @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 --服务器上的文件名 * @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(); } } } /** * 列出服务器上所有文件及目录 */ public static void listAllRemoteFiles(){ listRemoteFiles( " * " ); } /** * 列出服务器上文件和目录 * @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%-10sss/n " , " 名称 " , " 类型 " , " 修改日期 " , " 大小 " ); for (FTPFile file:fileTree){ System.out.printf( " %-35s%-10sss/n " ,iso8859togbk(file.getName()),FILE_TYPES[file.getType()] ,dateFormat.format(file.getTimestamp().getTime()),FileUtils.byteCountToDisplaySize(file.getSize())); } } } catch (Exception e){ e.printStackTrace(); } } /** * 关闭连接 */ public static void closeConnect(){ try { if (ftpClient != null ){ ftpClient.logout(); ftpClient.disconnect(); } } catch (Exception e){ e.printStackTrace(); } } /** * 设置配置文件 * @param configFile */ public static void setConfigFile(String configFile) { MiniFtp.configFile = configFile; } /** * 设置传输文件的类型[文本文件或者二进制文件] * @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; } /** * 设置参数 * @param configFile --参数的配置文件 */ 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(); } } } /** * 连接到服务器 */ 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服务器【 " + ip + " 】失败 " ); e.printStackTrace(); } } } /** * 进入到服务器的某个目录下 * @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(); } } /** * 设置FTP客服端的配置--一般可以不设置 * @return */ private static FTPClientConfig getFtpConfig(){ FTPClientConfig ftpConfig = new FTPClientConfig(FTPClientConfig.SYST_UNIX); ftpConfig.setServerLanguageCode(FTP.DEFAULT_CONTROL_ENCODING); return ftpConfig; } /** * 转码[ISO-8859-1 -> GBK] *不同的平台需要不同的转码 * @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 "" ; } }}