import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FtpTools {
private final static String ftphostaddr = "127.0.0.1";//服务器地址
private final static String ftppath = "E:\\ftp_data";//操作的服务器目录
private final static String ftpname = "Administrator";//服务器登录名
private final static String ftppwd = "ytd123456";//登录密码
private final static String localpath = "E:\\dt_data";
private final static String fileSeparator = System.getProperty("file.separator");
private static final Logger logger = LoggerFactory.getLogger(FtpTools.class);
public static void main(String[] args) {
FtpTools tools = new FtpTools();
tools.downFile("RDClass.java");
}
/**
* 从文件服务器上下载文件到本地
* @param filename
*/
public static void downFile(String filename) {
FTPClient ftp = initFtp();
try{
//4.指定要下载的目录
ftp.changeWorkingDirectory(ftppath);// 转移到FTP服务器目录
//5.遍历下载的目录
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
//解决中文乱码问题,两次解码
byte[] bytes=ff.getName().getBytes("iso-8859-1");
String fn=new String(bytes,"utf8");
if (fn.equals(filename)) {
//6.写操作,将其写入到本地文件中
logger.info("下载文件:"+filename+"开始:"+System.currentTimeMillis());
File localFile = new File(localpath +fileSeparator+ ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
//7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除(这步一般不用操作,为啥要删除服务器上面的文件呢)
if(localFile.exists()){
logger.info("删除服务器上文件:"+filename);
ftp.deleteFile(ff.getName());
}
logger.info("下载文件:"+filename+"结束:"+System.currentTimeMillis());
is.close();
}
}
ftp.logout();
}catch(Exception e){
e.printStackTrace();
new Exception("从服务器下载文件过程中发生错误");
}finally{
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
public static FTPClient initFtp() {
int reply;
FTPClient ftp = new FTPClient();
try {
// 1.连接服务器
//ftp.connect(ftphostaddr);
ftp.connect(ftphostaddr, 21);
// 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(ftpname, ftppwd);
// 3.判断登陆是否成功
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
new Exception("服务器连接失败");
}
return ftp;
}
}
原版(参数写死)
public void initDtData(fhycgz e) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String thatDate = sdf.format(e.getRq());
String dirPath = fhycgzController.class.getClassLoader().getResource("/").getPath() + File.separator + "conf";
Properties p = new Properties();
try {
p.load(new FileInputStream(dirPath + File.separator + "app.properties"));
String addr = p.getProperty("ftp.dt.service.addr");
String ftpPath = p.getProperty("ftp.dt.service.ftpPath");
String name = p.getProperty("ftp.dt.service.name");
String pwd = p.getProperty("ftp.dt.service.pwd");
String localPath = p.getProperty("ftp.dt.service.localPath");
String fileName = "RDClass.java";
FtpTools.downFile(addr, name, pwd, 21, ftpPath, fileName, localPath);
// 遍历本地所有文件,查找当天的dt文件
File file = new File(localPath);
File[] listFiles = file.listFiles();
for (File f : listFiles) {
logger.info("getName--->=" + f.getName());
if (f.isFile() && f.getName().contains(thatDate)) {
this.getTdByTdName(localPath + File.separator + f.getName());
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
优化版1(从配置文件读取参数)
package com.ytd.ebos.platform.fhycgz.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FtpTools {
private static final Logger logger = LoggerFactory.getLogger(FtpTools.class);
public static void main(String[] args) {
// FtpTools tools = new FtpTools();
// tools.downFile("RDClass.java");
}
/**
* 从文件服务器上下载文件到本地
*
* @param addr 服务器地址
* @param name 服务器登录名
* @param pwd 登录密码
* @param port 端口
* @param ftpPath 操作的服务器目录
* @param fileName 需要下载的文件名
* @param localPath 本地存放文件的目录
*/
public static void downFile(String addr,String name,String pwd,int port,String ftpPath,String fileName,String localPath) {
FTPClient ftp = initFtp(addr,name,pwd,port);
try {
// 4.指定要下载的目录
ftp.changeWorkingDirectory(ftpPath);// 转移到FTP服务器目录
// 5.遍历下载的目录
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
// 解决中文乱码问题,两次解码S
byte[] bytes = ff.getName().getBytes("iso-8859-1");
String fn = new String(bytes, "utf8");
if (fn.equals(fileName)) {
// 6.写操作,将其写入到本地文件中
logger.info("下载文件:" + fileName + "开始:" + System.currentTimeMillis());
File localFile = new File(localPath + File.separator + ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
// 7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除
// if(localFile.exists()){
// logger.info("删除服务器上文件:"+filename);
// ftp.deleteFile(ff.getName());
// }
logger.info("下载文件:" + fileName + "结束:" + System.currentTimeMillis());
is.close();
}
}
ftp.logout();
} catch (Exception e) {
e.printStackTrace();
new Exception("从服务器下载文件过程中发生错误");
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
public static FTPClient initFtp(String addr,String name,String pwd,int port ) {
int reply;
FTPClient ftp = new FTPClient();
try {
// 1.连接服务器
// ftp.connect(ftphostaddr);
ftp.connect(addr, port);
// 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(name, pwd);
// 3.判断登陆是否成功
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
new Exception("服务器连接失败");
}
return ftp;
}
}
优化版2(工具类)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FtpTools {
private static final Logger logger = LoggerFactory.getLogger(FtpTools.class);
public static void main(String[] args) {
// FtpTools tools = new FtpTools();
// tools.downFile("RDClass.java");
}
/**
* 从文件服务器上下载文件到本地
*
* @param addr 服务器地址
* @param name 服务器登录名
* @param pwd 登录密码
* @param port 端口
* @param ftpPath 操作的服务器目录
* @param fileName 需要下载的文件名
* @param localPath 本地存放文件的目录
*/
public static void downFile(String addr,String name,String pwd,int port,String ftpPath,String fileName,String localPath) {
FTPClient ftp = initFtp(addr,name,pwd,port);
try {
ftp.changeWorkingDirectory(ftpPath);// 转移到FTP服务器目录
String dirPath = FtpTools.class.getClassLoader().getResource("/").getPath() + File.separator + "conf";
Properties p = new Properties();
p.load(new FileInputStream(dirPath + File.separator + "ebos-app.properties"));
String encode = p.getProperty("ftp.dt.service.encoding");
if(encode==null){
encode="gb2312";
}
ftp.setControlEncoding(encode);
ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 4.指定要下载的目录
// 5.遍历下载的目录
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
// 解决中文乱码问题,两次解码S
// byte[] bytes = ff.getName().getBytes("iso-8859-1");
// byte[] bytes = ff.getName().getBytes("GB2312");
logger.info("getName:" + ff.getName());
// String fn = new String(bytes, "utf8");
String fn = ff.getName();
if (fn.contains(fileName)) {
// 6.写操作,将其写入到本地文件中
long start = System.currentTimeMillis();
logger.info("下载文件:" + fn + "开始:" + start);
File localFile = new File(localPath + File.separator + fn);
OutputStream os = new FileOutputStream(localFile);
// ftp.retrieveFile(fn, os);
ftp.retrieveFile(new String(fn.getBytes(encode), "iso-8859-1"), os);
// 7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除
// if(localFile.exists()){
// logger.info("删除服务器上文件:"+filename);
// ftp.deleteFile(ff.getName());
// }
long end = System.currentTimeMillis();
logger.info("下载文件:" + fn + "结束:" + end+",用时"+(end-start)/1000+"秒");
os.close();
}
}
ftp.logout();
} catch (Exception e) {
new Exception("从服务器下载文件过程中发生错误"+e.getMessage());
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
new Exception("从服务器下载文件过程中发生错误"+ioe.getMessage());
}
}
}
}
public static FTPClient initFtp(String addr,String name,String pwd,int port ) {
int reply;
FTPClient ftp = new FTPClient();
try {
// 1.连接服务器
// ftp.connect(ftphostaddr);
ftp.connect(addr, port);
// 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(name, pwd);
// 3.判断登陆是否成功
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
}
} catch (Exception e) {
new Exception("服务器连接失败");
}
return ftp;
}
}
ftp.retrieveFile(new