java读取FTP文件下载到本地
2017-03-24 11:15
423 查看
最近公司业务需要,研究了一下ftp的功能,发现还是比较实用的。ftp相当于是自己建一个网盘,然后创建用户,为用户提供上传下载功能。特别是多平台得数据交互,优势还是蛮大的。有兴趣的可以研究一下,限于篇幅,这里主要是讲解java调用ftp。
首先自己创建一个实体类:Ftp.java
然后创建一个工具类:FtpUtil.java
下面是在一个方法中调用ftp下载的过程
//定义本地下载文件名称(文件名自己定义)
String filename = PropertiesUtil.get("MERCHANTNO_ABC_BMP")+"."+chargedate+".txt";
//为Ftp实体赋值(根据自己的ftp实际值赋予,自己定义)
Ftp f = new Ftp();
f.setIpAddr(PropertiesUtil.get("ABC_BMP_FTP_IP"));
f.setUserName(PropertiesUtil.get("ABC_BMP_FTP_USERNAME"));
f.setPwd(PropertiesUtil.get("ABC_BMP_FTP_PASSWORD"));
f.setPath(PropertiesUtil.get("ABC_BMP_FTP_FILEURL"));
try {
//判断本地文件是否存在,不存在就往下执行
if(!FileUtil.ifExistFile(PropertiesUtil.get("ABC_BMP_FILEURL") + filename)){
// 从FTP中下载对账文件 参数 (ftp对象,本地地址,文件名)
if (FtpUtil.downfile(f, PropertiesUtil.get("ABC_BMP_FILEURL"), filename)){
//持久化对账文件
saveEpayFundEXY(PropertiesUtil.get("ABC_BMP_FILEURL")+filename, chargedate);
// 自动对账
payEBankDao.checkEpayment(chargedate, Constants.DataSource_autoDevice, Constants.BusiType_government,
PropertiesUtil.get("Bankcode"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
首先自己创建一个实体类:Ftp.java
/** * ftp链接常量 * */ public class Ftp { private String ipAddr;//ip地址 private Integer port;//端口号 private String userName;//用户名 private String pwd;//密码 private String path;//aaa路径 public String getIpAddr() { return ipAddr; } public void setIpAddr(String ipAddr) { this.ipAddr = ipAddr; } public Integer getPort() { return port; } public void setPort(Integer port) { this.port = port; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } }
然后创建一个工具类:FtpUtil.java
import java.io.File; import java.io.FileInputStream; 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.apache.log4j.Logger; /** * Ftp工具类 需要导入commons-net-3.4.jar这个包 */ public class FtpUtil { private static Logger logger=Logger.getLogger(FtpUtil.class); private static FTPClient ftp; /** * 获取ftp连接 * @param f * @return * @throws Exception */ public static boolean connectFtp(Ftp f) throws Exception{ ftp=new FTPClient(); boolean flag=false; int reply; try{ if (f.getPort()==null) { ftp.connect(f.getIpAddr(),21); }else{ ftp.connect(f.getIpAddr(),f.getPort()); } //ftp登陆 ftp.login(f.getUserName(), f.getPwd()); //设置文件传输类型 ftp.setFileType(FTPClient.BINARY_FILE_TYPE); //检查延时 reply = ftp.getReplyCode(); //如果延时不在200到300之间,就关闭连接 if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return flag; } ftp.changeWorkingDirectory(f.getPath()); flag = true; return flag; }catch(Exception e){ throw new Exception(e.getMessage()); } } /** * 关闭ftp连接 */ public static void closeFtp(){ if (ftp!=null && ftp.isConnected()) { try { ftp.logout(); ftp.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } /** * ftp上传文件 * @param f * @throws Exception */ public static void upload(File f) throws Exception{ if (f.isDirectory()) { ftp.makeDirectory(f.getName()); ftp.changeWorkingDirectory(f.getName()); //返回目录名和文件名组成的字符串数组 String[] files=f.list(); for(String fstr : files){ File file1=new File(f.getPath()+"/"+fstr); if (file1.isDirectory()) { upload(file1); ftp.changeToParentDirectory(); }else{ File file2=new File(f.getPath()+"/"+fstr); FileInputStream input=new FileInputStream(file2); ftp.storeFile(file2.getName(),input); input.close(); } } }else{ File file2=new File(f.getPath()); FileInputStream input=new FileInputStream(file2); ftp.storeFile(file2.getName(),input); input.close(); } } /** * 下载链接配置 * @param f * @param localBaseDir 本地目录 * @param remoteBaseDir 远程目录 * @throws Exception */ public static boolean startDown(Ftp f,String filename,String localBaseDir,String remoteBaseDir ) throws Exception{ if (FtpUtil.connectFtp(f)) { try { FTPFile[] files = null; boolean changedir = ftp.changeWorkingDirectory(remoteBaseDir); if (changedir) { ftp.setControlEncoding("GBK"); files = ftp.listFiles(); for (int i = 0; i < files.length; i++) { try{ if(filename.equals(files[i].getName())){ downloadFile(files[i], localBaseDir, remoteBaseDir); return true; } }catch(Exception e){ logger.error(e); logger.error("<"+files[i].getName()+">下载失败"); } } } } catch (Exception e) { logger.error(e); logger.error("下载过程中出现异常"); } }else{ logger.error("链接失败!"); } return false; } /** * * 下载FTP文件 * 当你需要下载FTP文件的时候,调用此方法 * 根据获取的文件名,本地地址,远程地址进行下载 * * @param ftpFile * @param relativeLocalPath * @param relativeRemotePath */ private static void downloadFile(FTPFile ftpFile, String relativeLocalPath,String relativeRemotePath) { if (ftpFile.isFile()) { if (ftpFile.getName().indexOf("?") == -1) { OutputStream outputStream = null; try { File entryDir = new File(relativeLocalPath); //如果文件夹路径不存在,则创建文件夹 if (!entryDir.exists() || !entryDir.isDirectory()) { entryDir.mkdirs(); } File locaFile= new File(relativeLocalPath+ ftpFile.getName()); //判断文件是否存在,存在则返回 if(locaFile.exists()){ return; }else{ outputStream = new FileOutputStream(relativeLocalPath+ ftpFile.getName()); ftp.retrieveFile(ftpFile.getName(), outputStream); outputStream.flush(); outputStream.close(); } } catch (Exception e) { logger.error(e); } finally { try { if (outputStream != null){ outputStream.close(); } } catch (IOException e) { logger.error("输出文件流异常"); } } } } else { String newlocalRelatePath = relativeLocalPath + ftpFile.getName(); String newRemote = new String(relativeRemotePath+ ftpFile.getName().toString()); File fl = new File(newlocalRelatePath); if (!fl.exists()) { fl.mkdirs(); } try { newlocalRelatePath = newlocalRelatePath + '/'; newRemote = newRemote + "/"; String currentWorkDir = ftpFile.getName().toString(); boolean changedir = ftp.changeWorkingDirectory(currentWorkDir); if (changedir) { FTPFile[] files = null; files = ftp.listFiles(); for (int i = 0; i < files.length; i++) { downloadFile(files[i], newlocalRelatePath, newRemote); } } if (changedir){ ftp.changeToParentDirectory(); } } catch (Exception e) { logger.error(e); } } } /** * 先配置下载链接,在下载文件。 调用了startDown和downloadFile写的方法 * @param f * @param savepath * @param filename * @return * @throws Exception */ public static boolean downfile(Ftp f,String savepath,String filename) throws Exception{ try{ FtpUtil.connectFtp(f); //File file = new File("F:/test/com/test/Testng.java"); //FtpUtil.upload(file);//把文件上传在ftp上 return FtpUtil.startDown(f, filename ,savepath, f.getPath());//下载ftp文件测试 }catch(Exception e){ throw new Exception(e.getMessage()); } } }
下面是在一个方法中调用ftp下载的过程
//定义本地下载文件名称(文件名自己定义)
String filename = PropertiesUtil.get("MERCHANTNO_ABC_BMP")+"."+chargedate+".txt";
//为Ftp实体赋值(根据自己的ftp实际值赋予,自己定义)
Ftp f = new Ftp();
f.setIpAddr(PropertiesUtil.get("ABC_BMP_FTP_IP"));
f.setUserName(PropertiesUtil.get("ABC_BMP_FTP_USERNAME"));
f.setPwd(PropertiesUtil.get("ABC_BMP_FTP_PASSWORD"));
f.setPath(PropertiesUtil.get("ABC_BMP_FTP_FILEURL"));
try {
//判断本地文件是否存在,不存在就往下执行
if(!FileUtil.ifExistFile(PropertiesUtil.get("ABC_BMP_FILEURL") + filename)){
// 从FTP中下载对账文件 参数 (ftp对象,本地地址,文件名)
if (FtpUtil.downfile(f, PropertiesUtil.get("ABC_BMP_FILEURL"), filename)){
//持久化对账文件
saveEpayFundEXY(PropertiesUtil.get("ABC_BMP_FILEURL")+filename, chargedate);
// 自动对账
payEBankDao.checkEpayment(chargedate, Constants.DataSource_autoDevice, Constants.BusiType_government,
PropertiesUtil.get("Bankcode"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
相关文章推荐
- java下载远程FTP文件至本地
- java开发:读取ftp服务器文件通过浏览器下载
- java 远程从FTP服务器下载文件到本地
- java 远程从FTP服务器下载文件到本地
- java 远程从FTP服务器下载文件到本地
- 读取excel文件(jxl.jar包简介/java操作excel jxl.jar下载地址)
- php实现从ftp服务器上下载文件树到本地电脑的程序
- java实现ftp文件上传下载
- oracle 调用Java 实现ftp文件的上传和下载 问题
- java读取本地excel文件代码
- JAVA实现FTP服务器文件的上传,下载,删除功能
- java实现ftp下载文件【转】
- Java 实现ftp文件的上传和下载
- JAVA连接FTP服务器,并上传/下载文件代码
- jaVA使用FTP上传下载文件的问题
- 用java编写多线程ftp断点下载文件程序
- java做的比较完善的FTP连接上传下载文件
- JAVA实现FTP文件上传下载文件
- 从ftp服务器上下载文件树到本地电脑的php程序
- [Java]远程下载文件并读取实例方法