“`java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.SocketException;
import java.util.ArrayList;
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 zcj
* @Date 2018-06-29
*/
public class FtpUtils {
public static Logger logger = Logger.getLogger(FtpUtils.class);
public static FTPClient ftp;
public static ArrayList allFiles;
public static String host = "192.168.36.225";
public static int port = 21;
public static String loginName = "administrator";
public static String password = "admin#1234";
//重写构造函数
public FtpUtils( boolean isPrint ){
ftp = new FTPClient();
allFiles = new ArrayList();
// 设置将过程中使用到的命令输出到控制台
if( isPrint ){
ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
}
}
/**
* 登录Ftp
* @param host 主机地址
* @param port 端口
* @param loginName 登录名
* @param password 密码
* @throws IOException
* @throws SocketException
*/
public boolean loginFtp(String host , int port , String loginName , String password) throws SocketException, IOException{
ftp.connect(host, port);
if(FTPReply.isPositiveCompletion(ftp.getReplyCode())){
boolean isLogin = ftp.login(loginName , password);
if( isLogin ){
ftp.setControlEncoding("utf-8");//中文支持
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//二进制传输
ftp.enterLocalPassiveMode();//每次启动一个端口进行传输
return true;
}
}
//登录不成功关闭连接节省资源
disConnection();
return false;
}
/**
* 关闭数据链接
* @throws IOException
*/
public void disConnection() throws IOException{
if(ftp.isConnected()){
ftp.disconnect();
}
}
/**
* 退出FTP
* @throws IOException
*/
public boolean logout() throws IOException{
return ftp.logout();
}
/**
* 递归遍历出指定目录下所有文件
* @param pathName 需要遍历的目录,必须以"/"开始和结束
* @throws IOException
*/
public ArrayList ergodicList(String pathName) throws IOException{
if( pathName.startsWith("/") && pathName.endsWith("/") ){
String directory = pathName;
//更换目录到当前目录
ftp.changeWorkingDirectory(directory);
FTPFile[] files = ftp.listFiles();
for( FTPFile file : files ){
if( file.isFile() ){
allFiles.add( directory+file.getName() );
}else if( file.isDirectory() ){
ergodicList(directory+file.getName() +File.separatorChar);
}
}
}
return allFiles;
}
/**
* 获取指定路径下的指定的文件名的文件
* @param pathName 指定路径
* @param ext 扩展名成
* @throws IOException
*/
public ArrayList ergodicListExt( String pathName,String ext ) throws IOException{
if(pathName.startsWith("/") && pathName.endsWith("/")){
String directory = pathName;
//切换FTP目录到当前目录
ftp.changeWorkingDirectory(directory);
FTPFile[] files = ftp.listFiles();
for( FTPFile file:files ){
if( file.isFile() ){
if( file.getName().endsWith(ext) ){
allFiles.add( directory+file.getName() );
}
}else if( file.isDirectory() ){
ergodicListExt( directory+file.getName()+File.separatorChar, ext );
}
}
}
return allFiles;
}
/**
* 批量下载
* String localNam 下载的本地路径
* String pathName 下载的文件主路径
* @throws IOException
*/
public void downListFile( String localPath , String pathName ) throws IOException{
if( pathName.startsWith("/")&&pathName.endsWith("/") ){
String directory = pathName;
//更换目录到当前目录
ftp.changeWorkingDirectory(directory);
FTPFile[] files = ftp.listFiles();
for(FTPFile file : files){
File localFile = new File(localPath);
if( !localFile.exists() ){
localFile.mkdirs();
}
OutputStream is = new FileOutputStream( localFile+"/"+file.getName() );
ftp.retrieveFile( file.getName(), is );
is.close();
}
}
}
/**
* 下载单个文件
* @param pathName 文件主路径
* @param localPath 本地路径
* @param fileName 文件名称
* @throws IOException
* @throws Exception
*/
public boolean downOneFile( String pathName , String localPath , String fileName ) throws IOException{
if( pathName.startsWith("/")&&pathName.endsWith("/") ){
ftp.changeWorkingDirectory(pathName);
File localFile = new File(localPath );
if( !localFile.exists() ){
localFile.mkdirs();
}
OutputStream os = new FileOutputStream(localFile+"/"+ fileName);
ftp.retrieveFile(fileName, os);
os.close();
}
return true;
}
public static void main(String[] args) throws Exception {
//工具实例化
FtpUtils ftpUtils = new FtpUtils(true);
//登录FTP服务器
boolean login = ftpUtils.loginFtp(host,port,loginName,password);
System.out.println("-----------------------登录验证START-------------------------");
System.out.println("登录结果----》"+login+"<《-----果结录登");
System.out.println("-----------------------登录验证END-------------------------");
System.out.println();
ftpUtils.downOneFile("/QA/AA/201803/","/Users/zcj/Desktop/test/", "0f459685be2145d3ad8293a8c1cddadb.xlsx");
//ftpUtils.downListFile("/Users/zcj/Desktop/test/","/QA/AA/201803/");
// System.out.println(“———————–获取某路径下的所有文件START————————-“);
// //获取某个目录下的所有文件路径
// ArrayList list = ftpUtils.ergodicList(“/QA/AA/201803/”);
// for (String string : list) {
// System.out.println(string);
// }
// System.out.println(“———————–获取某路径下的所有文件END————————-“);
//
// System.out.println();
//
// System.out.println(“———————–获取某路径下的指定类型所有文件START————————-“);
// ArrayList listExt = ftpUtils.ergodicListExt(“/QA/AA/201803/”, “xlsx”);
// for (String string : listExt) {
// System.out.println( string );
// }
// System.out.println(“———————–获取某路径下的指定类型所有文件 END————————-“);
}
}