软件编程
位置:首页>> 软件编程>> java编程>> JAVA SFTP文件上传、下载及批量下载实例

JAVA SFTP文件上传、下载及批量下载实例

作者:meimao5211  发布时间:2023-02-11 14:31:46 

标签:java,sftp

1.jsch官方API查看地址(附件为需要的jar)

http://www.jcraft.com/jsch/

2.jsch简介

JSch(Java Secure Channel)是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。

SFTP(Secure File Transfer Protocol)安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式,但是传输效率比普通的FTP要低。

3.api常用的方法:

  • put():      文件上传

  • get():      文件下载

  • cd():       进入指定目录

  • ls():       得到指定目录下的文件列表

  • rename():   重命名指定文件或目录

  • rm():       删除指定文件

  • mkdir():    创建目录

  • rmdir():    删除目录

  • put和get都有多个重载方法,自己看源代码

4.对常用方法的使用,封装成一个util类


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import org.apache.log4j.Logger;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
import com.jcraft.jsch.ChannelSftp.LsEntry;
/**
* sftp工具类
*
* @author xxx
* @date 2014-6-17
* @time 下午1:39:44
* @version 1.0
*/
public class SFTPUtils
{
 private static Logger log = Logger.getLogger(SFTPUtils.class.getName());

private String host;//服务器连接ip
 private String username;//用户名
 private String password;//密码
 private int port = 22;//端口号
 private ChannelSftp sftp = null;
 private Session sshSession = null;

public SFTPUtils(){}

public SFTPUtils(String host, int port, String username, String password)
 {
   this.host = host;
   this.username = username;
   this.password = password;
   this.port = port;
 }

public SFTPUtils(String host, String username, String password)
 {
   this.host = host;
   this.username = username;
   this.password = password;
 }

/**
  * 通过SFTP连接服务器
  */
 public void connect()
 {
   try
   {
     JSch jsch = new JSch();
     jsch.getSession(username, host, port);
     sshSession = jsch.getSession(username, host, port);
     if (log.isInfoEnabled())
     {
       log.info("Session created.");
     }
     sshSession.setPassword(password);
     Properties sshConfig = new Properties();
     sshConfig.put("StrictHostKeyChecking", "no");
     sshSession.setConfig(sshConfig);
     sshSession.connect();
     if (log.isInfoEnabled())
     {
       log.info("Session connected.");
     }
     Channel channel = sshSession.openChannel("sftp");
     channel.connect();
     if (log.isInfoEnabled())
     {
       log.info("Opening Channel.");
     }
     sftp = (ChannelSftp) channel;
     if (log.isInfoEnabled())
     {
       log.info("Connected to " + host + ".");
     }
   }
   catch (Exception e)
   {
     e.printStackTrace();
   }
 }

/**
  * 关闭连接
  */
 public void disconnect()
 {
   if (this.sftp != null)
   {
     if (this.sftp.isConnected())
     {
       this.sftp.disconnect();
       if (log.isInfoEnabled())
       {
         log.info("sftp is closed already");
       }
     }
   }
   if (this.sshSession != null)
   {
     if (this.sshSession.isConnected())
     {
       this.sshSession.disconnect();
       if (log.isInfoEnabled())
       {
         log.info("sshSession is closed already");
       }
     }
   }
 }

/**
  * 批量下载文件
  * @param remotPath:远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
  * @param localPath:本地保存目录(以路径符号结束,D:\Duansha\sftp\)
  * @param fileFormat:下载文件格式(以特定字符开头,为空不做检验)
  * @param fileEndFormat:下载文件格式(文件格式)
  * @param del:下载后是否删除sftp文件
  * @return
  */
 public List<String> batchDownLoadFile(String remotePath, String localPath,
     String fileFormat, String fileEndFormat, boolean del)
 {
   List<String> filenames = new ArrayList<String>();
   try
   {
     // connect();
     Vector v = listFiles(remotePath);
     // sftp.cd(remotePath);
     if (v.size() > 0)
     {
       System.out.println("本次处理文件个数不为零,开始下载...fileSize=" + v.size());
       Iterator it = v.iterator();
       while (it.hasNext())
       {
         LsEntry entry = (LsEntry) it.next();
         String filename = entry.getFilename();
         SftpATTRS attrs = entry.getAttrs();
         if (!attrs.isDir())
         {
           boolean flag = false;
           String localFileName = localPath + filename;
           fileFormat = fileFormat == null ? "" : fileFormat
               .trim();
           fileEndFormat = fileEndFormat == null ? ""
               : fileEndFormat.trim();
           // 三种情况
           if (fileFormat.length() > 0 && fileEndFormat.length() > 0)
           {
             if (filename.startsWith(fileFormat) && filename.endsWith(fileEndFormat))
             {
               flag = downloadFile(remotePath, filename,localPath, filename);
               if (flag)
               {
                 filenames.add(localFileName);
                 if (flag && del)
                 {
                   deleteSFTP(remotePath, filename);
                 }
               }
             }
           }
           else if (fileFormat.length() > 0 && "".equals(fileEndFormat))
           {
             if (filename.startsWith(fileFormat))
             {
               flag = downloadFile(remotePath, filename, localPath, filename);
               if (flag)
               {
                 filenames.add(localFileName);
                 if (flag && del)
                 {
                   deleteSFTP(remotePath, filename);
                 }
               }
             }
           }
           else if (fileEndFormat.length() > 0 && "".equals(fileFormat))
           {
             if (filename.endsWith(fileEndFormat))
             {
               flag = downloadFile(remotePath, filename,localPath, filename);
               if (flag)
               {
                 filenames.add(localFileName);
                 if (flag && del)
                 {
                   deleteSFTP(remotePath, filename);
                 }
               }
             }
           }
           else
           {
             flag = downloadFile(remotePath, filename,localPath, filename);
             if (flag)
             {
               filenames.add(localFileName);
               if (flag && del)
               {
                 deleteSFTP(remotePath, filename);
               }
             }
           }
         }
       }
     }
     if (log.isInfoEnabled())
     {
       log.info("download file is success:remotePath=" + remotePath
           + "and localPath=" + localPath + ",file size is"
           + v.size());
     }
   }
   catch (SftpException e)
   {
     e.printStackTrace();
   }
   finally
   {
     // this.disconnect();
   }
   return filenames;
 }

/**
  * 下载单个文件
  * @param remotPath:远程下载目录(以路径符号结束)
  * @param remoteFileName:下载文件名
  * @param localPath:本地保存目录(以路径符号结束)
  * @param localFileName:保存文件名
  * @return
  */
 public boolean downloadFile(String remotePath, String remoteFileName,String localPath, String localFileName)
 {
   FileOutputStream fieloutput = null;
   try
   {
     // sftp.cd(remotePath);
     File file = new File(localPath + localFileName);
     // mkdirs(localPath + localFileName);
     fieloutput = new FileOutputStream(file);
     sftp.get(remotePath + remoteFileName, fieloutput);
     if (log.isInfoEnabled())
     {
       log.info("===DownloadFile:" + remoteFileName + " success from sftp.");
     }
     return true;
   }
   catch (FileNotFoundException e)
   {
     e.printStackTrace();
   }
   catch (SftpException e)
   {
     e.printStackTrace();
   }
   finally
   {
     if (null != fieloutput)
     {
       try
       {
         fieloutput.close();
       }
       catch (IOException e)
       {
         e.printStackTrace();
       }
     }
   }
   return false;
 }

/**
  * 上传单个文件
  * @param remotePath:远程保存目录
  * @param remoteFileName:保存文件名
  * @param localPath:本地上传目录(以路径符号结束)
  * @param localFileName:上传的文件名
  * @return
  */
 public boolean uploadFile(String remotePath, String remoteFileName,String localPath, String localFileName)
 {
   FileInputStream in = null;
   try
   {
     createDir(remotePath);
     File file = new File(localPath + localFileName);
     in = new FileInputStream(file);
     sftp.put(in, remoteFileName);
     return true;
   }
   catch (FileNotFoundException e)
   {
     e.printStackTrace();
   }
   catch (SftpException e)
   {
     e.printStackTrace();
   }
   finally
   {
     if (in != null)
     {
       try
       {
         in.close();
       }
       catch (IOException e)
       {
         e.printStackTrace();
       }
     }
   }
   return false;
 }

/**
  * 批量上传文件
  * @param remotePath:远程保存目录
  * @param localPath:本地上传目录(以路径符号结束)
  * @param del:上传后是否删除本地文件
  * @return
  */
 public boolean bacthUploadFile(String remotePath, String localPath,
     boolean del)
 {
   try
   {
     connect();
     File file = new File(localPath);
     File[] files = file.listFiles();
     for (int i = 0; i < files.length; i++)
     {
       if (files[i].isFile()
           && files[i].getName().indexOf("bak") == -1)
       {
         if (this.uploadFile(remotePath, files[i].getName(),
             localPath, files[i].getName())
             && del)
         {
           deleteFile(localPath + files[i].getName());
         }
       }
     }
     if (log.isInfoEnabled())
     {
       log.info("upload file is success:remotePath=" + remotePath
           + "and localPath=" + localPath + ",file size is "
           + files.length);
     }
     return true;
   }
   catch (Exception e)
   {
     e.printStackTrace();
   }
   finally
   {
     this.disconnect();
   }
   return false;

}

/**
  * 删除本地文件
  * @param filePath
  * @return
  */
 public boolean deleteFile(String filePath)
 {
   File file = new File(filePath);
   if (!file.exists())
   {
     return false;
   }

if (!file.isFile())
   {
     return false;
   }
   boolean rs = file.delete();
   if (rs && log.isInfoEnabled())
   {
     log.info("delete file success from local.");
   }
   return rs;
 }

/**
  * 创建目录
  * @param createpath
  * @return
  */
 public boolean createDir(String createpath)
 {
   try
   {
     if (isDirExist(createpath))
     {
       this.sftp.cd(createpath);
       return true;
     }
     String pathArry[] = createpath.split("/");
     StringBuffer filePath = new StringBuffer("/");
     for (String path : pathArry)
     {
       if (path.equals(""))
       {
         continue;
       }
       filePath.append(path + "/");
       if (isDirExist(filePath.toString()))
       {
         sftp.cd(filePath.toString());
       }
       else
       {
         // 建立目录
         sftp.mkdir(filePath.toString());
         // 进入并设置为当前目录
         sftp.cd(filePath.toString());
       }

}
     this.sftp.cd(createpath);
     return true;
   }
   catch (SftpException e)
   {
     e.printStackTrace();
   }
   return false;
 }

/**
  * 判断目录是否存在
  * @param directory
  * @return
  */
 public boolean isDirExist(String directory)
 {
   boolean isDirExistFlag = false;
   try
   {
     SftpATTRS sftpATTRS = sftp.lstat(directory);
     isDirExistFlag = true;
     return sftpATTRS.isDir();
   }
   catch (Exception e)
   {
     if (e.getMessage().toLowerCase().equals("no such file"))
     {
       isDirExistFlag = false;
     }
   }
   return isDirExistFlag;
 }

/**
  * 删除stfp文件
  * @param directory:要删除文件所在目录
  * @param deleteFile:要删除的文件
  * @param sftp
  */
 public void deleteSFTP(String directory, String deleteFile)
 {
   try
   {
     // sftp.cd(directory);
     sftp.rm(directory + deleteFile);
     if (log.isInfoEnabled())
     {
       log.info("delete file success from sftp.");
     }
   }
   catch (Exception e)
   {
     e.printStackTrace();
   }
 }

/**
  * 如果目录不存在就创建目录
  * @param path
  */
 public void mkdirs(String path)
 {
   File f = new File(path);

String fs = f.getParent();

f = new File(fs);

if (!f.exists())
   {
     f.mkdirs();
   }
 }

/**
  * 列出目录下的文件
  *
  * @param directory:要列出的目录
  * @param sftp
  * @return
  * @throws SftpException
  */
 public Vector listFiles(String directory) throws SftpException
 {
   return sftp.ls(directory);
 }

public String getHost()
 {
   return host;
 }

public void setHost(String host)
 {
   this.host = host;
 }

public String getUsername()
 {
   return username;
 }

public void setUsername(String username)
 {
   this.username = username;
 }

public String getPassword()
 {
   return password;
 }

public void setPassword(String password)
 {
   this.password = password;
 }

public int getPort()
 {
   return port;
 }

public void setPort(int port)
 {
   this.port = port;
 }

public ChannelSftp getSftp()
 {
   return sftp;
 }

public void setSftp(ChannelSftp sftp)
 {
   this.sftp = sftp;
 }

/**测试*/
 public static void main(String[] args)
 {
   SFTPUtils sftp = null;
   // 本地存放地址
   String localPath = "D:/tomcat5/webapps/ASSESS/DocumentsDir/DocumentTempDir/txtData/";
   // Sftp下载路径
   String sftpPath = "/home/assess/sftp/jiesuan_2/2014/";
   List<String> filePathList = new ArrayList<String>();
   try
   {
     sftp = new SFTPUtils("10.163.201.115", "tdcp", "tdcp");
     sftp.connect();
     // 下载
     sftp.batchDownLoadFile(sftpPath, localPath, "ASSESS", ".txt", true);
   }
   catch (Exception e)
   {
     e.printStackTrace();
   }
   finally
   {
     sftp.disconnect();
   }
 }
}

5.需要的时间辅助类,顺带记下,下次可以直接拿来用


/**
* 时间处理工具类(简单的)
* @author Aaron
* @date 2014-6-17
* @time 下午1:39:44
* @version 1.0
*/
public class DateUtil {
  /**
  * 默认时间字符串的格式
  */
 public static final String DEFAULT_FORMAT_STR = "yyyyMMddHHmmss";

public static final String DATE_FORMAT_STR = "yyyyMMdd";

/**
  * 获取系统时间的昨天
  * @return
  */
 public static String getSysTime(){
    Calendar ca = Calendar.getInstance();  
    ca.set(Calendar.DATE, ca.get(Calendar.DATE)-1);
    Date d = ca.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    String a = sdf.format(d);
   return a;
 }

/**
  * 获取当前时间
  * @param date
  * @return
  */
 public static String getCurrentDate(String formatStr)
 {
   if (null == formatStr)
   {
     formatStr=DEFAULT_FORMAT_STR;
   }
   return date2String(new Date(), formatStr);
 }

/**
  * 返回年月日
  * @return yyyyMMdd
  */
 public static String getTodayChar8(String dateFormat){
   return DateFormatUtils.format(new Date(), dateFormat);
 }

/**
  * 将Date日期转换为String
  * @param date
  * @param formatStr
  * @return
  */
 public static String date2String(Date date, String formatStr)
 {
   if (null == date || null == formatStr)
   {
     return "";
   }
   SimpleDateFormat df = new SimpleDateFormat(formatStr);

return df.format(date);
 }
}

来源:http://www.cnblogs.com/meimao5211/p/6376597.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com