JAVA连接FTP工具类
FTP的MAVEN依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
<scope>compile</scope>
</dependency>
FTP工具类
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPFileFilter;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
import java.io.*;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.List;
public class FTPUtils {
private static Logger log = Logger.getLogger(FTPUtils.class);
public static FTPClient getFTPClient(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword) {
FTPClient ftp = null;
try {
ftp = new FTPClient();
ftp.connect(ftpHost, ftpPort);
ftp.login(ftpUserName, ftpPassword);
ftp.setConnectTimeout(50000);
ftp.setControlEncoding("UTF-8");
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
log.info("未连接到FTP,用户名或密码错误");
ftp.disconnect();
} else {
log.info("FTP连接成功");
}
} catch (SocketException e) {
e.printStackTrace();
log.info("FTP的IP地址可能错误,请正确配置");
} catch (IOException e) {
e.printStackTrace();
log.info("FTP的端口错误,请正确配置");
}
return ftp;
}
public boolean readFileByFolder(FTPClient ftp,String folderPath,String filePath){
boolean flage = false;
try {
ftp.changeWorkingDirectory(new String(folderPath.getBytes("UTF-8"),"ISO-8859-1"));
ftp.enterLocalPassiveMode();
FTPFile files[] = ftp.listFiles();
InputStream in = null;
BufferedReader reader = null;
BufferedWriter bw = null;
for (FTPFile file : files) {
if(file.isFile()){
String fileName = file.getName();
if(fileName.endsWith(".txt")){
in = ftp.retrieveFileStream(new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"));
reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line;
bw = new BufferedWriter(new FileWriter(filePath));
while((line = reader.readLine())!=null){
bw.write(line);
bw.newLine();
}
if(reader!=null){
reader.close();
}
if(in!=null){
in.close();
}
if(bw!=null){
bw.flush();
bw.close();
}
ftp.completePendingCommand();
}
}
if(file.isDirectory()){
String path = folderPath+File.separator+file.getName();
readFileByFolder(ftp,path,filePath);
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("文件解析失败");
}
return flage;
}
public static boolean downLoadFTP(FTPClient ftp, String filePath, String fileName,
String downPath) {
boolean flag = false;
try {
ftp.changeWorkingDirectory(filePath);
ftp.enterLocalPassiveMode();
FTPFile[] files = ftp.listFiles();
for (FTPFile file : files) {
if (file.getName().equals(fileName)) {
File downFile = new File(downPath + File.separator
+ file.getName());
OutputStream out = new FileOutputStream(downFile);
flag = ftp.retrieveFile(new String(file.getName().getBytes("UTF-8"), "ISO-8859-1"), out);
out.flush();
out.close();
if (flag) {
log.info("下载成功");
} else {
log.error("下载失败");
}
}
}
} catch (Exception e) {
log.error("下载失败");
}
return flag;
}
public static boolean uploadFile(FTPClient ftp, String filePath, String ftpPath) {
boolean flag = false;
InputStream in = null;
try {
ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
if (!ftp.changeWorkingDirectory(ftpPath)) {
ftp.makeDirectory(ftpPath);
}
ftp.changeWorkingDirectory(ftpPath);
File file = new File(filePath);
in = new FileInputStream(file);
String tempName = ftpPath + File.separator + file.getName();
flag = ftp.storeFile(new String(tempName.getBytes("UTF-8"), "ISO-8859-1"), in);
if (flag) {
log.info("上传成功");
} else {
log.error("上传失败");
}
} catch (Exception e) {
e.printStackTrace();
log.error("上传失败");
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return flag;
}
public static boolean copyFile(FTPClient ftp, String olePath, String newPath, String fileName) {
boolean flag = false;
try {
ftp.changeWorkingDirectory(olePath);
ftp.enterLocalPassiveMode();
FTPFile[] files = ftp.listFiles();
ByteArrayInputStream in = null;
ByteArrayOutputStream out = null;
for (FTPFile file : files) {
if (file.getName().equals(fileName)) {
out = new ByteArrayOutputStream();
ftp.retrieveFile(new String(file.getName().getBytes("UTF-8"), "ISO-8859-1"), out);
in = new ByteArrayInputStream(out.toByteArray());
ftp.makeDirectory(newPath);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
flag = ftp.storeFile(newPath + File.separator + (new String(file.getName().getBytes("UTF-8"), "ISO-8859-1")), in);
out.flush();
out.close();
in.close();
if (flag) {
log.info("转存成功");
} else {
log.error("复制失败");
}
}
}
} catch (Exception e) {
log.error("复制失败");
}
return flag;
}
public static FTPFile[] listFile(FTPClient ftpClient, String workingDir, String dateTime) {
FTPFile[] ftpFiles = null;
final long monitoringTime = DateFormatUtils.parseDateFormat2(dateTime).getTime();
try {
ftpClient.changeWorkingDirectory(workingDir);
ftpFiles = ftpClient.listFiles("./", new FTPFileFilter() {
@Override
public boolean accept(FTPFile ftpFile) {
Calendar timestamp = ftpFile.getTimestamp();
long timeInMillis = timestamp.getTimeInMillis();
log.info("文件产生的日期为:" + DateFormatUtils.fileNameByTime(timeInMillis));
return timeInMillis >= monitoringTime;
}
});
} catch (IOException e) {
e.printStackTrace();
}
return ftpFiles;
}
public static FTPFile[] listFileBetWeenTime(FTPClient ftpClient, String workingDir, String startTime, String endTime) {
FTPFile[] ftpFiles = null;
final long monitoringStartTime = DateFormatUtils.parseDateFormat2(startTime).getTime();
final long monitoringEndTime = DateFormatUtils.parseDateFormat2(endTime).getTime();
try {
ftpClient.changeWorkingDirectory(workingDir);
ftpFiles = ftpClient.listFiles("./", new FTPFileFilter() {
@Override
public boolean accept(FTPFile ftpFile) {
Calendar timestamp = ftpFile.getTimestamp();
long timeInMillis = timestamp.getTimeInMillis();
return (timeInMillis >= monitoringStartTime && timeInMillis <= monitoringEndTime);
}
});
} catch (IOException e) {
e.printStackTrace();
}
return ftpFiles;
}
public static List<FTPFile> listAllFile(FTPClient ftpClient, String workingDir, List<FTPFile> ftpFiles) {
try {
ftpClient.changeWorkingDirectory(workingDir);
FTPFile[] ftpFilesTmp = ftpClient.listFiles();
for (FTPFile ftpFile : ftpFilesTmp) {
if (ftpFile.isDirectory()) {
listAllFile(ftpClient, workingDir + "/" + ftpFile.getName(), ftpFiles);
} else {
ftpFiles.add(ftpFile);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return ftpFiles;
}
public static boolean moveFile(FTPClient ftp, String oldPath, String newPath) {
boolean flag = false;
try {
ftp.changeWorkingDirectory(oldPath);
ftp.enterLocalPassiveMode();
FTPFile[] files = ftp.listFiles();
if (!ftp.changeWorkingDirectory(newPath)) {
ftp.makeDirectory(newPath);
}
ftp.changeWorkingDirectory(oldPath);
for (FTPFile file : files) {
flag = ftp.rename(new String(file.getName().getBytes("UTF-8"), "ISO-8859-1"), newPath + File.separator + new String(file.getName().getBytes("UTF-8"), "ISO-8859-1"));
if (flag) {
log.info(file.getName() + "移动成功");
} else {
log.error(file.getName() + "移动失败");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("移动文件失败");
}
return flag;
}
public static boolean deleteByFolder(FTPClient ftp, String ftpFolder) {
boolean flag = false;
try {
ftp.changeWorkingDirectory(new String(ftpFolder.getBytes("UTF-8"), "ISO-8859-1"));
ftp.enterLocalPassiveMode();
FTPFile[] files = ftp.listFiles();
for (FTPFile file : files) {
if (file.isFile()) {
ftp.deleteFile(new String(file.getName().getBytes("UTF-8"), "ISO-8859-1"));
}
if (file.isDirectory()) {
String childPath = FtpFolder + File.separator + file.getName();
deleteByFolder(ftp, childPath);
}
}
flag = ftp.removeDirectory(new String(FtpFolder.getBytes("UTF-8"), "ISO-8859-1"));
if (flag) {
log.info(FtpFolder + "文件夹删除成功");
} else {
log.error(FtpFolder + "文件夹删除成功");
}
} catch (Exception e) {
e.printStackTrace();
log.error("删除失败");
}
return flag;
}
public static boolean deleteFile(FTPClient client, String workDir, String filename) {
boolean flag = false;
try {
System.out.println("开始删除文件");
client.changeWorkingDirectory(workDir);
client.dele(filename);
flag = true;
System.out.println("删除文件成功");
} catch (Exception e) {
System.out.println("删除文件失败");
e.printStackTrace();
}
return flag;
}
public static boolean closeFTP(FTPClient ftp) {
try {
ftp.logout();
} catch (Exception e) {
log.error("FTP关闭失败");
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
log.error("FTP关闭失败");
}
}
}
return false;
}
}