搜尋
首頁Javajava教程詳解JAVA SFTP檔案上傳,下載及批次下載的實例程式碼

本篇文章主要介紹了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      進入指定目錄

  • ls   的檔案清單

  • rename():   重新命名指定檔案或目錄

  • rm():       
  • 刪除

    #指定檔案

  • mk
  • dir

    ():    建立目錄

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

以上是詳解JAVA SFTP檔案上傳,下載及批次下載的實例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JVM中的類加載程序子系統如何促進平台獨立性?JVM中的類加載程序子系統如何促進平台獨立性?Apr 23, 2025 am 12:14 AM

類加載器通過統一的類文件格式、動態加載、雙親委派模型和平台無關的字節碼,確保Java程序在不同平台上的一致性和兼容性,實現平台獨立性。

Java編譯器會產生特定於平台的代碼嗎?解釋。Java編譯器會產生特定於平台的代碼嗎?解釋。Apr 23, 2025 am 12:09 AM

Java編譯器生成的代碼是平台無關的,但最終執行的代碼是平台特定的。 1.Java源代碼編譯成平台無關的字節碼。 2.JVM將字節碼轉換為特定平台的機器碼,確保跨平台運行但性能可能不同。

JVM如何處理不同操作系統的多線程?JVM如何處理不同操作系統的多線程?Apr 23, 2025 am 12:07 AM

多線程在現代編程中重要,因為它能提高程序的響應性和資源利用率,並處理複雜的並發任務。 JVM通過線程映射、調度機制和同步鎖機制,在不同操作系統上確保多線程的一致性和高效性。

在Java的背景下,'平台獨立性”意味著什麼?在Java的背景下,'平台獨立性”意味著什麼?Apr 23, 2025 am 12:05 AM

Java的平台獨立性是指編寫的代碼可以在任何安裝了JVM的平台上運行,無需修改。 1)Java源代碼編譯成字節碼,2)字節碼由JVM解釋執行,3)JVM提供內存管理和垃圾回收功能,確保程序在不同操作系統上運行。

Java應用程序仍然可以遇到平台特定的錯誤或問題嗎?Java應用程序仍然可以遇到平台特定的錯誤或問題嗎?Apr 23, 2025 am 12:03 AM

Javaapplicationscanindeedencounterplatform-specificissuesdespitetheJVM'sabstraction.Reasonsinclude:1)Nativecodeandlibraries,2)Operatingsystemdifferences,3)JVMimplementationvariations,and4)Hardwaredependencies.Tomitigatethese,developersshould:1)Conduc

雲計算如何影響Java平台獨立性的重要性?雲計算如何影響Java平台獨立性的重要性?Apr 22, 2025 pm 07:05 PM

云计算显著提升了Java的平台独立性。1)Java代码编译为字节码,由JVM在不同操作系统上执行,确保跨平台运行。2)使用Docker和Kubernetes部署Java应用,提高可移植性和可扩展性。

Java的平台獨立性在廣泛採用中扮演著什麼角色?Java的平台獨立性在廣泛採用中扮演著什麼角色?Apr 22, 2025 pm 06:53 PM

Java'splatformindependenceallowsdeveloperstowritecodeonceandrunitonanydeviceorOSwithaJVM.Thisisachievedthroughcompilingtobytecode,whichtheJVMinterpretsorcompilesatruntime.ThisfeaturehassignificantlyboostedJava'sadoptionduetocross-platformdeployment,s

容器化技術(例如Docker)如何影響Java平台獨立性的重要性?容器化技術(例如Docker)如何影響Java平台獨立性的重要性?Apr 22, 2025 pm 06:49 PM

容器化技術如Docker增強而非替代Java的平台獨立性。 1)確保跨環境的一致性,2)管理依賴性,包括特定JVM版本,3)簡化部署過程,使Java應用更具適應性和易管理性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中