1、FTP上传和下载工具类

import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.MalformedURLException;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);
     public static FTPClient ftpClient = null;
     
     private String username;   
     private String password;     
     private String host;  
     private int port;  
     
     
     public FtpUtil(String host,String username, String password,int port) {  
         this.username = username;  
         this.password = password;  
         this.host = host;  
         this.port = port;  
     } 
     
     /**
      * 初始化ftp服务器
      */
     public void initFtpClient() {
         ftpClient = new FTPClient();
         ftpClient.setControlEncoding("utf-8");
         try {
             ftpClient.connect(this.host,  this.port); 
             ftpClient.login(this.username, this.password);
             
             int replyCode = ftpClient.getReplyCode(); 
             if(!FTPReply.isPositiveCompletion(replyCode)){
                 logger.error("ftp连接失败...");
             }
             logger.info("ftp连接成功...");
         }catch (MalformedURLException e) { 
            e.printStackTrace(); 
         }catch (IOException e) { 
            e.printStackTrace(); 
         } 
     }    /**
     * 上传文件
     * @param pathname ftp服务保存地址
     * @param fileName 上传到ftp的文件名
     *  @param originfilename 待上传文件的名称(绝对地址) * 
     * @return
     */
     public  boolean uploadFile( String pathname, String fileName,String originfilename){
         boolean flag = false;
         InputStream inputStream = null;
         try{
             logger.info("开始上传文件");
             inputStream = new FileInputStream(new File(originfilename));
             initFtpClient();
             ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
             CreateDirecroty(pathname);
             ftpClient.makeDirectory(pathname);
             ftpClient.changeWorkingDirectory(pathname);
             ftpClient.storeFile(fileName, inputStream);
             inputStream.close();
             ftpClient.logout();
             flag = true;
             logger.info("上传文件成功");
         }catch (Exception e) {
             logger.info("上传文件失败");
             e.printStackTrace();
         }finally{
             if(ftpClient.isConnected()){ 
                 try{
                     ftpClient.disconnect();
                 }catch(IOException e){
                     e.printStackTrace();
                 }
             } 
             if(null != inputStream){
                 try {
                     inputStream.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 } 
             } 
         }
         return true;
     }
     /**
      * 上传文件
      * @param pathname ftp服务保存地址
      * @param fileName 上传到ftp的文件名
      * @param inputStream 输入文件流 
      * @return
      */
     public boolean uploadFile( String pathname, String fileName,InputStream inputStream){
         boolean flag = false;
         try{
             logger.info("开始上传文件");
             initFtpClient();
             ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
             CreateDirecroty(pathname);
             ftpClient.makeDirectory(pathname);
             ftpClient.changeWorkingDirectory(pathname);
             ftpClient.storeFile(fileName, inputStream);
             inputStream.close();
             ftpClient.logout();
             flag = true;
             logger.info("上传文件成功");
         }catch (Exception e) {
             logger.info("上传文件失败");
             e.printStackTrace();
         }finally{
             if(ftpClient.isConnected()){ 
                 try{
                     ftpClient.disconnect();
                 }catch(IOException e){
                     e.printStackTrace();
                 }
             } 
             if(null != inputStream){
                 try {
                     inputStream.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 } 
             } 
         }
         return true;
     }
     //改变目录路径
     private  boolean changeWorkingDirectory(String directory) {
             boolean flag = true;
             try {
                 flag = ftpClient.changeWorkingDirectory(directory);
                 if (flag) {
                   System.out.println("进入文件夹" + directory + " 成功!");                } else {
                     System.out.println("进入文件夹" + directory + " 失败!开始创建文件夹");
                 }
             } catch (IOException ioe) {
                 ioe.printStackTrace();
             }
             return flag;
         }    //创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
     private   boolean CreateDirecroty(String remote) throws IOException {
         boolean success = true;
         String directory = remote + "/";
         // 如果远程目录不存在,则递归创建远程服务器目录
         if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(new String(directory))) {
             int start = 0;
             int end = 0;
             if (directory.startsWith("/")) {
                 start = 1;
             } else {
                 start = 0;
             }
             end = directory.indexOf("/", start);
             String path = "";
             String paths = "";
             while (true) {
                 String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");
                 path = path + "/" + subDirectory;
                 if (!existFile(path)) {
                     if (makeDirectory(subDirectory)) {
                         changeWorkingDirectory(subDirectory);
                     } else {
                         System.out.println("创建目录[" + subDirectory + "]失败");
                         changeWorkingDirectory(subDirectory);
                     }
                 } else {
                     changeWorkingDirectory(subDirectory);
                 }                paths = paths + "/" + subDirectory;
                 start = end + 1;
                 end = directory.indexOf("/", start);
                 // 检查所有目录是否创建完毕
                 if (end <= start) {
                     break;
                 }
             }
         }
         return success;
     }  //判断ftp服务器文件是否存在    
     private  boolean existFile(String path) throws IOException {
             boolean flag = false;
             FTPFile[] ftpFileArr = ftpClient.listFiles(path);
             if (ftpFileArr.length > 0) {
                 flag = true;
             }
             return flag;
         }
     //创建目录
     private  boolean makeDirectory(String dir) {
         boolean flag = true;
         try {
             flag = ftpClient.makeDirectory(dir);
             if (flag) {
                 System.out.println("创建文件夹" + dir + " 成功!");            } else {
                 System.out.println("创建文件夹" + dir + " 失败!");
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
         return flag;
     }
     
     /** * 下载文件 * 
     * @param pathname FTP服务器文件目录 * 
     * @param filename 文件名称 * 
     * @param localpath 下载后的文件路径 * 
     * @return */
     public  boolean downloadFile(String pathname, String filename, String localpath){ 
         boolean flag = false; 
         OutputStream os=null;
         try { 
             logger.info("开始下载文件");
             initFtpClient();
             //切换FTP目录 
             ftpClient.changeWorkingDirectory(pathname); 
             FTPFile[] ftpFiles = ftpClient.listFiles(); 
             for(FTPFile file : ftpFiles){ 
                 if(filename.equalsIgnoreCase(file.getName())){ 
                     File localFile = new File(localpath + "/" + file.getName()); 
                     os = new FileOutputStream(localFile); 
                     ftpClient.retrieveFile(file.getName(), os); 
                     os.close(); 
                 } 
             } 
             ftpClient.logout(); 
             flag = true; 
             logger.info("下载文件成功");
         } catch (Exception e) { 
             logger.info("下载文件失败");
             e.printStackTrace(); 
         } finally{ 
             if(ftpClient.isConnected()){ 
                 try{
                     ftpClient.disconnect();
                 }catch(IOException e){
                     e.printStackTrace();
                 }
             } 
             if(null != os){
                 try {
                     os.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 } 
             } 
         } 
         return flag; 
     }
     
     /** * 删除文件 * 
     * @param pathname FTP服务器保存目录 * 
     * @param filename 要删除的文件名称 * 
     * @return */ 
     public boolean deleteFile(String pathname, String filename){ 
         boolean flag = false; 
         try { 
             logger.info("开始删除文件");
             initFtpClient();
             //切换FTP目录 
             ftpClient.changeWorkingDirectory(pathname); 
             ftpClient.dele(filename); 
             ftpClient.logout();
             flag = true; 
             logger.info("删除文件成功");
         } catch (Exception e) { 
             logger.info("删除文件失败");
             e.printStackTrace(); 
         } finally {
             if(ftpClient.isConnected()){ 
                 try{
                     ftpClient.disconnect();
                 }catch(IOException e){
                     e.printStackTrace();
                 }
             } 
         }
         return flag; 
     }
     
     public static void main(String[] args) {
          //FtpUtil.uploadFile("/", "2018-08-06.zip", "D://temp//2018-08-06.zip");
         /*ftp.downloadFile("ftpFile/data", "123.docx", "F://");
         ftp.deleteFile("ftpFile/data", "123.docx");
         System.out.println("ok");*/
     }
 }


2、SFTP上传和下载工具类

import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
 import java.util.Vector;import org.apache.commons.io.IOUtils;
 import org.apache.log4j.Logger;import com.jcraft.jsch.Channel;
 import com.jcraft.jsch.ChannelSftp;
 import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.JSchException;
 import com.jcraft.jsch.Session;
 import com.jcraft.jsch.SftpException;
 /** 
 * 类说明 sftp工具类
 */
 public class SFTPUtil {
     
     private static Logger logger = Logger.getLogger(SFTPUtil.class);
     
     private ChannelSftp sftp;  
         
     private Session session;  
     /** SFTP 登录用户名*/    
     private String username; 
     /** SFTP 登录密码*/    
     private String password;  
     /** 私钥 */    
     private String privateKey;  
     /** SFTP 服务器地址IP地址*/    
     private String host;  
     /** SFTP 端口*/  
     private int port;  
         
     
     /**  
      * 构造基于密码认证的sftp对象  
      */    
     public SFTPUtil(String username, String password, String host, int port) {  
         this.username = username;  
         this.password = password;  
         this.host = host;  
         this.port = port;  
     } 
     
     /**  
      * 构造基于秘钥认证的sftp对象 
      */  
     public SFTPUtil(String username, String host, int port, String privateKey) {  
         this.username = username;  
         this.host = host;  
         this.port = port;  
         this.privateKey = privateKey;  
     }  
     
     public SFTPUtil(){}  
     
     
     /** 
      * 连接sftp服务器 
      */  
     public void login(){  
         try {  
             JSch jsch = new JSch();  
             if (privateKey != null) {  
                 jsch.addIdentity(privateKey);// 设置私钥  
             }  
     
             session = jsch.getSession(username, host, port);  
            
             if (password != null) {  
                 session.setPassword(password);    
             }  
             Properties config = new Properties();  
             config.put("StrictHostKeyChecking", "no");  
                 
             session.setConfig(config);  
             session.connect();  
               
             Channel channel = session.openChannel("sftp");  
             channel.connect();  
     
             sftp = (ChannelSftp) channel;  
         } catch (JSchException e) {  
             e.printStackTrace();
         }  
     }    
     
     /** 
      * 关闭连接 server  
      */  
     public void logout(){  
         if (sftp != null) {  
             if (sftp.isConnected()) {  
                 sftp.disconnect();  
             }  
         }  
         if (session != null) {  
             if (session.isConnected()) {  
                 session.disconnect();  
             }  
         }  
     }  
  
     
     /**  
      * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
      * @param basePath  服务器的基础路径 
      * @param directory  上传到该目录  
      * @param sftpFileName  sftp端文件名  
      * @param in   输入流  
      */  
     public void upload(String basePath,String directory, String sftpFileName, InputStream input) throws SftpException{  
         try {   
             sftp.cd(basePath);
             sftp.cd(directory);  
         } catch (SftpException e) { 
             //目录不存在,则创建文件夹
             String [] dirs=directory.split("/");
             String tempPath=basePath;
             for(String dir:dirs){
                 if(null== dir || "".equals(dir)) continue;
                 tempPath+="/"+dir;
                 try{ 
                     sftp.cd(tempPath);
                 }catch(SftpException ex){
                     sftp.mkdir(tempPath);
                     sftp.cd(tempPath);
                 }
             }
         }  
         sftp.put(input, sftpFileName);  //上传文件
     } 
     
  
     /** 
      * 下载文件。
      * @param directory 下载目录  
      * @param downloadFile 下载的文件 
      * @param saveFile 存在本地的路径 
      */    
     public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{  
         if (directory != null && !"".equals(directory)) {  
             sftp.cd(directory);  
         }  
         File file = new File(saveFile);  
         sftp.get(downloadFile, new FileOutputStream(file));  
     }  
     
     /**  
      * 下载文件 
      * @param directory 下载目录 
      * @param downloadFile 下载的文件名 
      * @return 字节数组 
      */  
     public byte[] download(String directory, String downloadFile) throws SftpException, IOException{  
         if (directory != null && !"".equals(directory)) {  
             sftp.cd(directory);  
         }  
         InputStream is = sftp.get(downloadFile);  
           
         byte[] fileData = IOUtils.toByteArray(is);  
           
         return fileData;  
     }  
     
     
     /** 
      * 删除文件 
      * @param directory 要删除文件所在目录 
      * @param deleteFile 要删除的文件 
      */  
     public void delete(String directory, String deleteFile) throws SftpException{  
         sftp.cd(directory);  
         sftp.rm(deleteFile);  
     }  
     
     
     /** 
      * 列出目录下的文件 
      * @param directory 要列出的目录 
      * @param sftp 
      */  
     public Vector<?> listFiles(String directory) throws SftpException {  
         return sftp.ls(directory);  
     }  
       
     //上传文件测试
     public static void main(String[] args) throws SftpException, IOException {  
         SFTPUtil sftp = new SFTPUtil("neusoft", "neusoft_980544", "192.168.205.4", 22);  
         sftp.login();  
         File file = new File("D:\\1.txt");  
         InputStream is = new FileInputStream(file);  
           
         sftp.upload("/home/neusoft/","ftp", "1.txt", is);  
         sftp.logout();  
     }  
 }