栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;

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;
  }

  
  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");
 }
      }
    }
  }

  
  public List batchDownLoadFile(String remotePath, String localPath,
      String fileFormat, String fileEndFormat, boolean del)
  {
    List filenames = new ArrayList();
    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;
  }

  
  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;
  }

  
  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;
  }

  
  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;

  }

  
  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;
  }

  
  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;
  }

  
  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;
  }

  
  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();
    }
  }

  
  public void mkdirs(String path)
  {
    File f = new File(path);

    String fs = f.getParent();

    f = new File(fs);

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

  
  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 filePathList = new ArrayList();
    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.需要的时间辅助类,顺带记下,下次可以直接拿来用


public class DateUtil {
   
  public static final String DEFAULT_FORMAT_STR = "yyyyMMddHHmmss";
  
  public static final String DATE_FORMAT_STR = "yyyyMMdd";
  
  
  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;
  }
  
  
  public static String getCurrentDate(String formatStr)
  {
    if (null == formatStr)
    {
      formatStr=DEFAULT_FORMAT_STR;
    }
    return date2String(new Date(), formatStr);
  }
  
  
  public static String getTodayChar8(String dateFormat){
    return DateFormatUtils.format(new Date(), dateFormat);
  }
  
  
  public static String date2String(Date date, String formatStr)
  {
    if (null == date || null == formatStr)
    {
      return "";
    }
    SimpleDateFormat df = new SimpleDateFormat(formatStr);

    return df.format(date);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/147221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号