java开发FTP客户端列出指定目录下面所有文件
??? 利用commons2.0(http://commons.apache.org/net)开发的一个列出FTP目录下面的所有文件。列文件的主要是一个递归方法的调用,目前支持列出一种指定的文件类型或所有文件。在对中文的支持方面,注意设置FTPClient的ControlEncoding即可。具体代码如下。
import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.Iterator;import org.apache.commons.net.PrintCommandListener;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;import org.apache.log4j.Logger;/** * 列出FTP服务器上指定目录下面的所有文件 * @author BenZhou mailto:zhouzb@qq.com * 原文地址:http://zhouzaibao.iteye.com/blog/362866 */public class FTPListAllFiles {private static Logger logger = Logger.getLogger(FTPListAllFiles.class);public FTPClient ftp;public ArrayList<String> arFiles;/** * 重载构造函数 * @param isPrintCommmand 是否打印与FTPServer的交互命令 */public FTPListAllFiles(boolean isPrintCommmand){ftp = new FTPClient();arFiles = new ArrayList<String>();if(isPrintCommmand){ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));}}/** * 登陆FTP服务器 * @param host FTPServer IP地址 * @param port FTPServer 端口 * @param username FTPServer 登陆用户名 * @param password FTPServer 登陆密码 * @return 是否登录成功 * @throws IOException */public boolean login(String host,int port,String username,String password) throws IOException{this.ftp.connect(host,port);if(FTPReply.isPositiveCompletion(this.ftp.getReplyCode())){if(this.ftp.login(username, password)){this.ftp.setControlEncoding("GBK");return true;}}if(this.ftp.isConnected()){this.ftp.disconnect();}return false;}/** * 关闭数据链接 * @throws IOException */public void disConnection() throws IOException{if(this.ftp.isConnected()){this.ftp.disconnect();}}/** * 递归遍历出目录下面所有文件 * @param pathName 需要遍历的目录,必须以"/"开始和结束 * @throws IOException */public void List(String pathName) throws IOException{if(pathName.startsWith("/")&&pathName.endsWith("/")){String directory = pathName;//更换目录到当前目录this.ftp.changeWorkingDirectory(directory);FTPFile[] files = this.ftp.listFiles();for(FTPFile file:files){if(file.isFile()){arFiles.add(directory+file.getName());}else if(file.isDirectory()){List(directory+file.getName()+"/");}}}}/** * 递归遍历目录下面指定的文件名 * @param pathName 需要遍历的目录,必须以"/"开始和结束 * @param ext 文件的扩展名 * @throws IOException */public void List(String pathName,String ext) throws IOException{if(pathName.startsWith("/")&&pathName.endsWith("/")){String directory = pathName;//更换目录到当前目录this.ftp.changeWorkingDirectory(directory);FTPFile[] files = this.ftp.listFiles();for(FTPFile file:files){if(file.isFile()){if(file.getName().endsWith(ext)){arFiles.add(directory+file.getName());}}else if(file.isDirectory()){List(directory+file.getName()+"/",ext);}}}}public static void main(String[] args) throws IOException {FTPListAllFiles f = new FTPListAllFiles(true);if(f.login("192.168.0.3", 21, "test", "test")){f.List("/","mp4");}f.disConnection();Iterator<String> it = f.arFiles.iterator();while(it.hasNext()){logger.info(it.next());}}}