JAVA-FTP批量大文件传输
FTP的具体使用
FTP是一种网络协议,用于进行不同服务器主机之间的文件传输,或者简单地说两台不同IP的机器之间的文件传输。在java中我们什么时候需要用到FTP文件传输呢?比如两台服务器的互动,将我这台机器上的资源文件传输给你,让你也能拥有他。
FTP用起来其实也是一个相当简单,但是却非常实用的技术。下面就贴出FTP的源代码和注释,让大家去理解FTP的用法。
------------------------------------------FTPbean,也可以用配置文件来搞定------------------------------------------------
![](https://images2015.cnblogs.com/blog/1111496/201703/1111496-20170310215112342-1181798341.png)
--------------------------------------------------over,请自行生成get/set方法-----下面是工具类----------------------------
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; 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; if (f.getPort()==null) { ftp.connect(f.getIpAddr(),21); }else{ ftp.connect(f.getIpAddr(),f.getPort()); } ftp.login(f.getUserName(), f.getPwd()); System.out.println("dengu chengg"); ftp.setFileType(FTPClient.BINARY_FILE_TYPE); reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return flag; } ftp.changeWorkingDirectory(f.getPath()); System.out.println(f.getPath()); flag = true; return flag; } /** * 关闭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( new String(f.getName().getBytes("GBK"), "ISO-8859-1")); ftp.changeWorkingDirectory( new String(f.getName().getBytes("GBK"), "ISO-8859-1")); 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( new String(file2.getName().getBytes("GBK"), "ISO-8859-1"),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 void startDown(Ftp f,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{ downloadFile(files[i], localBaseDir, remoteBaseDir); }catch(Exception e){ logger.error(e); logger.error("<"+files[i].getName()+">下载失败"); } } } } catch (Exception e) { logger.error(e); logger.error("下载过程中出现异常"); } }else{ logger.error("链接失败!"); } } /** * * 下载FTP文件 * 当你需要下载FTP文件的时候,调用此方法 * 根据<b>获取的文件名,本地地址,远程地址</b>进行下载 * * @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 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); } } } public static void main(String[] args) throws Exception{ Ftp f=new Ftp(); f.setIpAddr("192.168.0.**"); f.setUserName("username"); f.setPwd("password"); FtpUtil.connectFtp(f); String pathx = "D:\\1cc3bfc2694544809499fd39d4984457"; //可以是文件夹,也可以是文件 File file = new File(pathx); FtpUtil.upload(file);//把文件上传在ftp上 //FtpUtil.startDown(f, "e:/", "/xxtest");//下载ftp文件测试 ftp.changeWorkingDirectory("/"); System.out.println("ok"); } }