package com.cmsz.core; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.SocketException; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; public class FTPTest { public static void main(String[] args) { FTPClient ftpclient = new FTPClient(); //传输的字符编码(防乱码) ftpclient.setControlEncoding("UTF-8"); //超时时间(防止FTP僵死) ftpclient.setConnectTimeout(1000 * 60); ftpclient.setDataTimeout(1000 * 60); ftpclient.setDefaultTimeout(1000 * 60); //工作流的大小 ftpclient.setBufferSize(1024 * 4); //主被动模式(应对FTP服务器的相关安全设置) //ftpclient.enterLocalPassiveMode(); ftpclient.enterLocalActiveMode(); FTPFile[] ftpFiles = null; try { //设置连接ip ftpclient.connect("192.168.59.127"); //连接是否正常 if (ftpclient.isConnected()) { //使用用户名和密码进行登录 if (ftpclient.login("admin", "Rebt@729")) { //判断FTP连接是否可用、源码中判断ReplyCode值为(reply >= 200) && (reply < 300)为可用,非单纯200! if(FTPReply.isPositiveCompletion(ftpclient.getReplyCode())){ System.out.println("FTP登录成功,FTP IP:" + ftpclient.getRemoteAddress()); //设置文件类型 try { //默认为ASCII(value:0),此处设置为2进制 System.out.println("设置文件类型为:"+ftpclient.BINARY_FILE_TYPE); ftpclient.setFileType(ftpclient.BINARY_FILE_TYPE); } catch (IOException e1) { e1.printStackTrace(); } System.out.println("当前工作目录为:" + ftpclient.printWorkingDirectory()); //设置工作目录 ftpclient.changeWorkingDirectory("/usr/admin/aBit/ab"); System.out.println("设置工作目录为:" + ftpclient.printWorkingDirectory()); ftpFiles = ftpclient.listFiles(); System.out.println("获得文件个数为:" + ftpFiles.length); OutputStream os = null; String name = null; int ftpleng = ftpFiles.length; /* * 下面的代码分别是批量下载、删除、上传的代码 * 其实为了更好的容错和符合逻辑,下载FTP文件和删除FTP源文件应该放在一个事务里面执行,本代码只是实例,方便看清楚 * 同理、上传文件到FTP和删除本地源文件也应该放在一个事务中执行 */ //循环下载文件 for (int i = 0; i < ftpleng; i++) { name = ftpFiles[i].getName(); System.out.println("下载FTP文件:" + name); os = new FileOutputStream("E:\\abc\\" + name); boolean ret = ftpclient.retrieveFile(name, os); if(ret){ System.out.println("下载FTP文件:"+name+"成功,完成度"+(i+1)+"/"+ftpleng); } } //删除FTP源文件 String dename = null; for(int y = 0; y < ftpleng; y++){ dename = ftpFiles[y].getName(); System.out.println("删除FTP文件:"+dename); boolean del = ftpclient.deleteFile(dename); if(del){ System.out.println("删除FTP文件:"+dename+"成功,完成度"+(y+1)+"/"+ftpleng); } } //上传文件到FTP服务器 //扫描本地文件 File file = new File("E:\\abc"); // 获取当前目录下的所有文件 File[] fs = file.listFiles(); FileInputStream fis = null; int x = 1; String name2 = null; int ftpsize = fs.length; for (File file2 : fs) { name2 = file2.getName(); System.out.println("上传本地文件:"+name2); fis = new FileInputStream("E:\\abc\\"+name2); boolean sto = ftpclient.storeFile(name2, fis); if(sto){ System.out.println("上传本地文件:"+name2+"成功,完成度"+x+"/"+ftpsize); } //比较本地文件与FTP文件的大小 //1.本地文件 long localfile = file2.length(); //2.FTP文件 FTPFile[] ftpfile = ftpclient.listFiles(name2); long ftpf = ftpfile[0].getSize(); if(localfile == ftpf){ System.out.println("本地文件与FTP文件大小一致、上传正常......"+ftpf); System.out.println("删除本地文件:"+name2); file2.delete(); }else{ System.out.println("本地文件与FTP文件大小不一,localFile:"+localfile+",FTP文件大小:"+ftpf); } x++; } } } else { System.out.println("FTP登录失败,FTP IP:" + ftpclient.getRemoteAddress()); } } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { ftpclient.logout(); } catch (IOException e) { System.out.println("尝试登出FTP失败"); e.printStackTrace(); } try { ftpclient.disconnect(); } catch (IOException e) { System.out.println("尝试断开FTP连接失败"); e.printStackTrace(); } } } }